From f65a3102817c60a51f99f969b4a75dc10593ddbd Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 15 Apr 2024 14:44:45 +0000 Subject: [PATCH 01/85] chore: clean up EigenPod file * move state into Storage contract * remove withdrawal proof method --- src/contracts/interfaces/IEigenPod.sol | 17 -- src/contracts/pods/EigenPod.sol | 287 ++----------------------- src/contracts/pods/EigenPodStorage.sol | 45 ++++ 3 files changed, 64 insertions(+), 285 deletions(-) create mode 100644 src/contracts/pods/EigenPodStorage.sol diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 69a31274b..effdc4758 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -188,23 +188,6 @@ interface IEigenPod { bytes32[][] calldata validatorFields ) external; - /** - * @notice This function records full and partial withdrawals on behalf of one of the Ethereum validators for this EigenPod - * @param oracleTimestamp is the timestamp of the oracle slot that the withdrawal is being proven against - * @param withdrawalProofs is the information needed to check the veracity of the block numbers and withdrawals being proven - * @param validatorFieldsProofs is the proof of the validator's fields' in the validator tree - * @param withdrawalFields are the fields of the withdrawals being proven - * @param validatorFields are the fields of the validators being proven - */ - function verifyAndProcessWithdrawals( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields, - bytes32[][] calldata withdrawalFields - ) external; - /** * @notice Called by the pod owner to activate restaking by withdrawing * all existing ETH from the pod and preventing further withdrawals via diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 803337661..63021e809 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -14,11 +14,11 @@ import "../libraries/Endian.sol"; import "../interfaces/IETHPOSDeposit.sol"; import "../interfaces/IEigenPodManager.sol"; -import "../interfaces/IEigenPod.sol"; import "../interfaces/IDelayedWithdrawalRouter.sol"; import "../interfaces/IPausable.sol"; import "./EigenPodPausingConstants.sol"; +import "./EigenPodStorage.sol"; /** * @title The implementation contract used for restaking beacon chain ETH on EigenLayer @@ -35,12 +35,16 @@ import "./EigenPodPausingConstants.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 IEigenPod, Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants { +contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants { + using BytesLib for bytes; using SafeERC20 for IERC20; using BeaconChainProofs for *; - // CONSTANTS + IMMUTABLES + /******************************************************************************* + CONSTANTS / IMMUTABLES + *******************************************************************************/ + // @notice Internal constant used in calculations, since the beacon chain stores balances in Gwei rather than wei uint256 internal constant GWEI_TO_WEI = 1e9; @@ -65,37 +69,9 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen /// @notice This is the genesis time of the beacon state, to help us calculate conversions between slot and timestamp uint64 public immutable GENESIS_TIME; - // STORAGE VARIABLES - /// @notice The owner of this EigenPod - address public podOwner; - - /** - * @notice The latest timestamp at which the pod owner withdrew the balance of the pod, via calling `withdrawBeforeRestaking`. - * @dev This variable is only updated when the `withdrawBeforeRestaking` function is called, which can only occur before `hasRestaked` is set to true for this pod. - * Proofs for this pod are only valid against Beacon Chain state roots corresponding to timestamps after the stored `mostRecentWithdrawalTimestamp`. - */ - uint64 public mostRecentWithdrawalTimestamp; - - /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), - uint64 public withdrawableRestakedExecutionLayerGwei; - - /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. - bool public hasRestaked; - - /// @notice This is a mapping of validatorPubkeyHash to timestamp to whether or not they have proven a withdrawal for that timestamp - mapping(bytes32 => mapping(uint64 => bool)) public provenWithdrawal; - - /// @notice This is a mapping that tracks a validator's information by their pubkey hash - mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; - - /// @notice This variable tracks any ETH deposited into this contract via the `receive` fallback function - uint256 public nonBeaconChainETHBalanceWei; - - /// @notice This variable tracks the total amount of partial withdrawals claimed via merkle proofs prior to a switch to ZK proofs for claiming partial withdrawals - uint64 public sumOfPartialWithdrawalsClaimedGwei; - - /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals - uint256 activeValidatorCount; + /******************************************************************************* + MODIFIERS + *******************************************************************************/ modifier onlyEigenPodManager() { require(msg.sender == address(eigenPodManager), "EigenPod.onlyEigenPodManager: not eigenPodManager"); @@ -140,6 +116,10 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen _; } + /******************************************************************************* + CONSTRUCTOR / INIT + *******************************************************************************/ + constructor( IETHPOSDeposit _ethPOS, IDelayedWithdrawalRouter _delayedWithdrawalRouter, @@ -169,6 +149,10 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen emit RestakingActivated(podOwner); } + /******************************************************************************* + EXTERNAL METHODS + *******************************************************************************/ + /// @notice payable fallback function that receives ether deposited to the eigenpods contract receive() external payable { nonBeaconChainETHBalanceWei += msg.value; @@ -223,62 +207,6 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, sharesDeltaGwei * int256(GWEI_TO_WEI)); } - /** - * @notice This function records full and partial withdrawals on behalf of one or more of this EigenPod's validators - * @param oracleTimestamp is the timestamp of the oracle slot that the withdrawal is being proven against - * @param stateRootProof proves a `beaconStateRoot` against a block root fetched from the oracle - * @param withdrawalProofs proves several withdrawal-related values against the `beaconStateRoot` - * @param validatorFieldsProofs proves `validatorFields` against the `beaconStateRoot` - * @param withdrawalFields are the fields of the withdrawals being proven - * @param validatorFields are the fields of the validators being proven - */ - function verifyAndProcessWithdrawals( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields, - bytes32[][] calldata withdrawalFields - ) external onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_WITHDRAWAL) { - require( - (validatorFields.length == validatorFieldsProofs.length) && - (validatorFieldsProofs.length == withdrawalProofs.length) && - (withdrawalProofs.length == withdrawalFields.length), - "EigenPod.verifyAndProcessWithdrawals: inputs must be same length" - ); - - // Verify passed-in beaconStateRoot against oracle-provided block root: - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getBlockRootAtTimestamp(oracleTimestamp), - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof - }); - - VerifiedWithdrawal memory withdrawalSummary; - for (uint256 i = 0; i < withdrawalFields.length; i++) { - VerifiedWithdrawal memory verifiedWithdrawal = _verifyAndProcessWithdrawal( - stateRootProof.beaconStateRoot, - withdrawalProofs[i], - validatorFieldsProofs[i], - validatorFields[i], - withdrawalFields[i] - ); - - withdrawalSummary.amountToSendGwei += verifiedWithdrawal.amountToSendGwei; - withdrawalSummary.sharesDeltaGwei += verifiedWithdrawal.sharesDeltaGwei; - } - - // If any withdrawals are eligible for immediate redemption, send to the pod owner via - // DelayedWithdrawalRouter - if (withdrawalSummary.amountToSendGwei != 0) { - _sendETH_AsDelayedWithdrawal(podOwner, withdrawalSummary.amountToSendGwei * GWEI_TO_WEI); - } - // If any withdrawals resulted in a change in the pod's shares, update the EigenPodManager - if (withdrawalSummary.sharesDeltaGwei != 0) { - eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, withdrawalSummary.sharesDeltaGwei * int256(GWEI_TO_WEI)); - } - } - /******************************************************************************* EXTERNAL FUNCTIONS CALLABLE BY EIGENPOD OWNER *******************************************************************************/ @@ -441,6 +369,7 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen /******************************************************************************* INTERNAL FUNCTIONS *******************************************************************************/ + /** * @notice internal function that proves an individual validator's withdrawal credentials * @param oracleTimestamp is the timestamp whose state root the `proof` will be proven against. @@ -574,176 +503,6 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen } } - function _verifyAndProcessWithdrawal( - bytes32 beaconStateRoot, - BeaconChainProofs.WithdrawalProof calldata withdrawalProof, - bytes calldata validatorFieldsProof, - bytes32[] calldata validatorFields, - bytes32[] calldata withdrawalFields - ) - internal - /** - * Check that the provided timestamp being proven against is after the `mostRecentWithdrawalTimestamp`. - * Without this check, there is an edge case where a user proves a past withdrawal for a validator whose funds they already withdrew, - * as a way to "withdraw the same funds twice" without providing adequate proof. - * Note that this check is not made using the oracleTimestamp as in the `verifyWithdrawalCredentials` proof; instead this proof - * proof is made for the timestamp of the withdrawal, which may be within SLOTS_PER_HISTORICAL_ROOT slots of the oracleTimestamp. - * This difference in modifier usage is OK, since it is still not possible to `verifyAndProcessWithdrawal` against a slot that occurred - * *prior* to the proof provided in the `verifyWithdrawalCredentials` function. - */ - proofIsForValidTimestamp(withdrawalProof.getWithdrawalTimestamp()) - returns (VerifiedWithdrawal memory) - { - uint64 withdrawalTimestamp = withdrawalProof.getWithdrawalTimestamp(); - bytes32 validatorPubkeyHash = validatorFields.getPubkeyHash(); - - /** - * Withdrawal processing should only be performed for "ACTIVE" or "WITHDRAWN" validators. - * (WITHDRAWN is allowed because technically you can deposit to a validator even after it exits) - */ - require( - _validatorPubkeyHashToInfo[validatorPubkeyHash].status != VALIDATOR_STATUS.INACTIVE, - "EigenPod._verifyAndProcessWithdrawal: Validator never proven to have withdrawal credentials pointed to this contract" - ); - - // Ensure we don't process the same withdrawal twice - require( - !provenWithdrawal[validatorPubkeyHash][withdrawalTimestamp], - "EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp" - ); - - provenWithdrawal[validatorPubkeyHash][withdrawalTimestamp] = true; - - // Verifying the withdrawal against verified beaconStateRoot: - BeaconChainProofs.verifyWithdrawal({ - beaconStateRoot: beaconStateRoot, - withdrawalFields: withdrawalFields, - withdrawalProof: withdrawalProof, - denebForkTimestamp: eigenPodManager.denebForkTimestamp() - }); - - uint40 validatorIndex = withdrawalFields.getValidatorIndex(); - - // Verify passed-in validatorFields against verified beaconStateRoot: - BeaconChainProofs.verifyValidatorFields({ - beaconStateRoot: beaconStateRoot, - validatorFields: validatorFields, - validatorFieldsProof: validatorFieldsProof, - validatorIndex: validatorIndex - }); - - uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - - /** - * If the withdrawal's epoch comes after the validator's "withdrawable epoch," we know the validator - * has fully withdrawn, and we process this as a full withdrawal. - */ - if (withdrawalProof.getWithdrawalEpoch() >= validatorFields.getWithdrawableEpoch()) { - return - _processFullWithdrawal( - validatorIndex, - validatorPubkeyHash, - withdrawalTimestamp, - podOwner, - withdrawalAmountGwei, - _validatorPubkeyHashToInfo[validatorPubkeyHash] - ); - } else { - return - _processPartialWithdrawal( - validatorIndex, - withdrawalTimestamp, - podOwner, - withdrawalAmountGwei - ); - } - } - - function _processFullWithdrawal( - uint40 validatorIndex, - bytes32 validatorPubkeyHash, - uint64 withdrawalTimestamp, - address recipient, - uint64 withdrawalAmountGwei, - ValidatorInfo memory validatorInfo - ) internal returns (VerifiedWithdrawal memory) { - - /** - * First, determine withdrawal amounts. We need to know: - * 1. How much can be withdrawn immediately - * 2. How much needs to be withdrawn via the EigenLayer withdrawal queue - */ - - uint64 amountToQueueGwei; - - if (withdrawalAmountGwei > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) { - amountToQueueGwei = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - } else { - amountToQueueGwei = withdrawalAmountGwei; - } - - /** - * If the withdrawal is for more than the max per-validator balance, we mark - * the max as "withdrawable" via the queue, and withdraw the excess immediately - */ - - VerifiedWithdrawal memory verifiedWithdrawal; - verifiedWithdrawal.amountToSendGwei = uint256(withdrawalAmountGwei - amountToQueueGwei); - withdrawableRestakedExecutionLayerGwei += amountToQueueGwei; - - /** - * Next, calculate the change in number of shares this validator is "backing": - * - Anything that needs to go through the withdrawal queue IS backed - * - Anything immediately withdrawn IS NOT backed - * - * This means that this validator is currently backing `amountToQueueGwei` shares. - */ - - verifiedWithdrawal.sharesDeltaGwei = _calculateSharesDelta({ - newAmountGwei: amountToQueueGwei, - previousAmountGwei: validatorInfo.restakedBalanceGwei - }); - - /** - * Finally, the validator is fully withdrawn. Update their status and place in state: - */ - - if (validatorInfo.status != VALIDATOR_STATUS.WITHDRAWN) { - activeValidatorCount--; - validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; - } - - validatorInfo.restakedBalanceGwei = 0; - _validatorPubkeyHashToInfo[validatorPubkeyHash] = validatorInfo; - - emit FullWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, recipient, withdrawalAmountGwei); - - return verifiedWithdrawal; - } - - function _processPartialWithdrawal( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address recipient, - uint64 partialWithdrawalAmountGwei - ) internal returns (VerifiedWithdrawal memory) { - emit PartialWithdrawalRedeemed( - validatorIndex, - withdrawalTimestamp, - recipient, - partialWithdrawalAmountGwei - ); - - sumOfPartialWithdrawalsClaimedGwei += partialWithdrawalAmountGwei; - - // For partial withdrawals, the withdrawal amount is immediately sent to the pod owner - return - VerifiedWithdrawal({ - amountToSendGwei: uint256(partialWithdrawalAmountGwei), - sharesDeltaGwei: 0 - }); - } - function _processWithdrawalBeforeRestaking(address _podOwner) internal { mostRecentWithdrawalTimestamp = uint32(block.timestamp); nonBeaconChainETHBalanceWei = 0; @@ -816,12 +575,4 @@ contract EigenPod is IEigenPod, Initializable, ReentrancyGuardUpgradeable, Eigen bytes32 validatorPubkeyHash = _calculateValidatorPubkeyHash(validatorPubkey); return _validatorPubkeyHashToInfo[validatorPubkeyHash].status; } - - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[44] private __gap; } diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol new file mode 100644 index 000000000..439d85162 --- /dev/null +++ b/src/contracts/pods/EigenPodStorage.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../interfaces/IEigenPod.sol"; + +abstract contract EigenPodStorage is IEigenPod { + + /// @notice The owner of this EigenPod + address public podOwner; + + /** + * @notice The latest timestamp at which the pod owner withdrew the balance of the pod, via calling `withdrawBeforeRestaking`. + * @dev This variable is only updated when the `withdrawBeforeRestaking` function is called, which can only occur before `hasRestaked` is set to true for this pod. + * Proofs for this pod are only valid against Beacon Chain state roots corresponding to timestamps after the stored `mostRecentWithdrawalTimestamp`. + */ + uint64 public mostRecentWithdrawalTimestamp; + + /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), + uint64 public withdrawableRestakedExecutionLayerGwei; + + /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. + bool public hasRestaked; + + /// @notice This is a mapping of validatorPubkeyHash to timestamp to whether or not they have proven a withdrawal for that timestamp + mapping(bytes32 => mapping(uint64 => bool)) public provenWithdrawal; + + /// @notice This is a mapping that tracks a validator's information by their pubkey hash + mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; + + /// @notice This variable tracks any ETH deposited into this contract via the `receive` fallback function + uint256 public nonBeaconChainETHBalanceWei; + + /// @notice This variable tracks the total amount of partial withdrawals claimed via merkle proofs prior to a switch to ZK proofs for claiming partial withdrawals + uint64 public sumOfPartialWithdrawalsClaimedGwei; + + /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals + uint256 activeValidatorCount; + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[44] private __gap; +} \ No newline at end of file From 9f574e3db49f3f0031c3cde412434cfc8b36ee4e Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 16 Apr 2024 20:53:06 +0000 Subject: [PATCH 02/85] feat: poc for partial withdrawal batching * feat: remove beaconChainOracle in favor of 4788 * modify verifyStaleBalance to use plural form * add pause flags for new methods * deprecate old state variables * minor cleanup and commenting * chore: get things compiling * i commented out/deleted a bajillion tests * fix: adjust storage footprint to be consistent with m2 --- .../devnet/M2_Deploy_From_Scratch.s.sol | 10 - script/deploy/goerli/GoerliUpgrade1.s.sol | 1 - script/deploy/goerli/GoerliUpgrade2.s.sol | 1 - .../holesky/M2_Deploy_From_Scratch.s.sol | 2 - script/deploy/mainnet/M1_Deploy.s.sol | 8 - script/deploy/mainnet/M2Deploy.s.sol | 6 - .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 12 +- script/utils/ExistingDeploymentParser.sol | 15 +- src/contracts/interfaces/IEigenPod.sol | 62 +- src/contracts/interfaces/IEigenPodManager.sol | 33 +- src/contracts/libraries/BeaconChainProofs.sol | 242 +--- src/contracts/pods/EigenPod.sol | 521 +++++--- src/contracts/pods/EigenPodManager.sol | 67 +- src/contracts/pods/EigenPodManagerStorage.sol | 27 +- .../pods/EigenPodPausingConstants.sol | 18 +- src/contracts/pods/EigenPodStorage.sol | 20 +- src/test/DepositWithdraw.t.sol | 3 +- src/test/EigenLayerDeployer.t.sol | 4 - src/test/EigenPod.t.sol | 1187 +++++++++-------- src/test/harnesses/EigenPodHarness.sol | 71 - .../integration/IntegrationDeployer.t.sol | 8 - .../integration/mocks/BeaconChainMock.t.sol | 692 +++++----- src/test/integration/users/User.t.sol | 112 +- src/test/mocks/EigenPodManagerMock.sol | 16 +- src/test/mocks/EigenPodMock.sol | 24 - src/test/unit/EigenPod-PodManagerUnit.t.sol | 573 ++++---- src/test/unit/EigenPodManagerUnit.t.sol | 39 +- src/test/unit/EigenPodUnit.t.sol | 1103 ++++++++------- 28 files changed, 2398 insertions(+), 2479 deletions(-) diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index 7d20193e0..b7fad3f7b 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -187,7 +187,6 @@ contract Deployer_M2 is Script, Test { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -561,21 +560,12 @@ contract Deployer_M2 is Script, Test { // require(delayedWithdrawalRouter.withdrawalDelayBlocks() == 7 days / 12 seconds, // "delayedWithdrawalRouter: withdrawalDelayBlocks initialized incorrectly"); // uint256 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32 ether; - require( - eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == 32 gwei, - "eigenPod: MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR initialized incorrectly" - ); require( strategyManager.strategyWhitelister() == operationsMultisig, "strategyManager: strategyWhitelister address not set correctly" ); - require( - eigenPodManager.beaconChainOracle() == IBeaconChainOracle(address(0)), - "eigenPodManager: eigenPodBeacon contract address not set correctly" - ); - require( delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, "delayedWithdrawalRouter: eigenPodManager set incorrectly" diff --git a/script/deploy/goerli/GoerliUpgrade1.s.sol b/script/deploy/goerli/GoerliUpgrade1.s.sol index 45e1258b5..e8ae0d0ef 100644 --- a/script/deploy/goerli/GoerliUpgrade1.s.sol +++ b/script/deploy/goerli/GoerliUpgrade1.s.sol @@ -72,7 +72,6 @@ contract GoerliUpgrade1 is Script, Test { IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), delayedWithdrawalRouter, eigenPodManager, - 32e9, 1616508000 ) ); diff --git a/script/deploy/goerli/GoerliUpgrade2.s.sol b/script/deploy/goerli/GoerliUpgrade2.s.sol index d643634f1..331a2b425 100644 --- a/script/deploy/goerli/GoerliUpgrade2.s.sol +++ b/script/deploy/goerli/GoerliUpgrade2.s.sol @@ -91,7 +91,6 @@ contract GoerliUpgrade2 is Script, Test { IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), delayedWithdrawalRouter, eigenPodManager, - 32e9, 1616508000 ) ); diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index 626626b49..a29fa93b8 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -76,7 +76,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { IETHPOSDeposit(ETHPOSDepositAddress), delayedWithdrawalRouter, eigenPodManager, - EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, EIGENPOD_GENESIS_TIME ); @@ -151,7 +150,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - beaconOracle, msg.sender, // initialOwner is msg.sender for now to set forktimestamp later eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS diff --git a/script/deploy/mainnet/M1_Deploy.s.sol b/script/deploy/mainnet/M1_Deploy.s.sol index 48a7db712..4117604e3 100644 --- a/script/deploy/mainnet/M1_Deploy.s.sol +++ b/script/deploy/mainnet/M1_Deploy.s.sol @@ -183,7 +183,6 @@ contract Deployer_M1 is Script, Test { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - uint64(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR), GOERLI_GENESIS_TIME ); @@ -239,8 +238,6 @@ contract Deployer_M1 is Script, Test { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - EIGENPOD_MANAGER_MAX_PODS, - IBeaconChainOracle(address(0)), executorMultisig, eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS @@ -542,11 +539,6 @@ contract Deployer_M1 is Script, Test { "strategyManager: strategyWhitelister address not set correctly" ); - require( - eigenPodManager.beaconChainOracle() == IBeaconChainOracle(address(0)), - "eigenPodManager: eigenPodBeacon contract address not set correctly" - ); - require( delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, "delayedWithdrawalRouter: eigenPodManager set incorrectly" diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index 45e765b4b..0c6a2e1f9 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -161,7 +161,6 @@ contract M2Deploy is Script, Test { _ethPOS: ethPOS, _delayedWithdrawalRouter: delayedWithdrawalRouter, _eigenPodManager: eigenPodManager, - _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR: 32 gwei, _GENESIS_TIME: 1616508000 }); @@ -276,10 +275,6 @@ contract M2Deploy is Script, Test { require(eigenPodManager.eigenPodBeacon() == eigenPodBeacon, "eigenPodManager.eigenPodBeacon incorrect"); require(eigenPodManager.strategyManager() == strategyManager, "eigenPodManager.strategyManager incorrect"); require(eigenPodManager.slasher() == slasher, "eigenPodManager.slasher incorrect"); - require( - address(eigenPodManager.beaconChainOracle()) == beaconChainOracle, - "eigenPodManager.beaconChainOracle incorrect" - ); require(eigenPodManager.numPods() == numPods, "eigenPodManager.numPods incorrect"); require(EigenPodManagerStorage(address(eigenPodManager)).delegationManager() == delegation, "eigenPodManager.delegationManager incorrect"); } @@ -308,7 +303,6 @@ contract M2Deploy is Script, Test { cheats.expectRevert(bytes("Initializable: contract is already initialized")); EigenPodManager(address(eigenPodManager)).initialize( - IBeaconChainOracle(address(this)), address(this), PauserRegistry(address(this)), 0 diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index daa042db5..27ef74b13 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -66,7 +66,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { IETHPOSDeposit(ETHPOSDepositAddress), delayedWithdrawalRouter, eigenPodManager, - EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, EIGENPOD_GENESIS_TIME ); delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); @@ -124,7 +123,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { eigenPodManager.unpause(0); eigenPodManager.setDenebForkTimestamp(EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP); - eigenPodManager.updateBeaconChainOracle(beaconOracle); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); vm.stopPrank(); @@ -211,11 +209,11 @@ contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { ); // set beacon chain oracle on EigenPodManager - txs[7] = Tx( - address(eigenPodManager), - 0, // value - abi.encodeWithSelector(EigenPodManager.updateBeaconChainOracle.selector, beaconOracle) - ); + // txs[7] = Tx( + // address(eigenPodManager), + // 0, // value + // abi.encodeWithSelector(EigenPodManager.updateBeaconChainOracle.selector, beaconOracle) + // ); // set Deneb fork timestamp on EigenPodManager txs[8] = Tx( diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index e264a86fa..44e1c3940 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -513,7 +513,15 @@ contract ExistingDeploymentParser is Script, Test { strategyManager.initialize(address(0), address(0), eigenLayerPauserReg, STRATEGY_MANAGER_INIT_PAUSED_STATUS); // EigenPodManager vm.expectRevert(bytes("Initializable: contract is already initialized")); +<<<<<<< HEAD eigenPodManager.initialize(beaconOracle, address(0), eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS); +======= + eigenPodManager.initialize( + address(0), + eigenLayerPauserReg, + EIGENPOD_MANAGER_INIT_PAUSED_STATUS + ); +>>>>>>> a524406e (feat: poc for partial withdrawal batching) // DelayedWithdrawalRouter vm.expectRevert(bytes("Initializable: contract is already initialized")); delayedWithdrawalRouter.initialize( @@ -641,10 +649,6 @@ contract ExistingDeploymentParser is Script, Test { eigenPodManager.denebForkTimestamp() == EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP, "eigenPodManager: denebForkTimestamp not set correctly" ); - require( - eigenPodManager.beaconChainOracle() == beaconOracle, - "eigenPodManager: beaconChainOracle not set correctly" - ); require( eigenPodManager.ethPOS() == IETHPOSDeposit(ETHPOSDepositAddress), "eigenPodManager: ethPOS not set correctly" @@ -657,12 +661,15 @@ contract ExistingDeploymentParser is Script, Test { "eigenPodImplementation: GENESIS TIME not set correctly" ); require( +<<<<<<< HEAD eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR && EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR % 1 gwei == 0, "eigenPodImplementation: MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR not set correctly" ); require( +======= +>>>>>>> a524406e (feat: poc for partial withdrawal batching) eigenPodImplementation.ethPOS() == IETHPOSDeposit(ETHPOSDepositAddress), "eigenPodImplementation: ethPOS not set correctly" ); diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index effdc4758..9c9d42518 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -21,6 +21,7 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ interface IEigenPod { + enum VALIDATOR_STATUS { INACTIVE, // doesnt exist ACTIVE, // staked on ethpos and withdrawal credentials are pointed to the EigenPod @@ -38,22 +39,14 @@ interface IEigenPod { VALIDATOR_STATUS status; } - /** - * @notice struct used to store amounts related to proven withdrawals in memory. Used to help - * manage stack depth and optimize the number of external calls, when batching withdrawal operations. - */ - struct VerifiedWithdrawal { - // amount to send to a podOwner from a proven withdrawal - uint256 amountToSendGwei; - // difference in shares to be recorded in the eigenPodManager, as a result of the withdrawal - int256 sharesDeltaGwei; - } + struct Checkpoint { + bytes32 beaconBlockRoot; + bytes32 beaconStateRoot; + uint256 podBalanceGwei; + int256 balanceDeltasGwei; - enum PARTIAL_WITHDRAWAL_CLAIM_STATUS { - REDEEMED, - PENDING, - FAILED + uint256 proofsRemaining; } /// @notice Emitted when an ETH validator stakes via this eigenPod @@ -66,22 +59,6 @@ interface IEigenPod { // is the validator's balance that is credited on EigenLayer. event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei); - /// @notice Emitted when an ETH validator is prove to have withdrawn from the beacon chain - event FullWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 withdrawalAmountGwei - ); - - /// @notice Emitted when a partial withdrawal claim is successfully redeemed - event PartialWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 partialWithdrawalAmountGwei - ); - /// @notice Emitted when restaked beacon chain ETH is withdrawn from the eigenPod. event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount); @@ -94,10 +71,6 @@ interface IEigenPod { /// @notice Emitted when ETH that was previously received via the `receive` fallback is withdrawn event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn); - - /// @notice The max amount of eth, in gwei, that can be restaked per validator - function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() external view returns (uint64); - /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); @@ -141,9 +114,6 @@ interface IEigenPod { /// @notice Returns the validatorInfo struct for the provided pubkey function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory); - ///@notice mapping that tracks proven withdrawals - function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external view returns (bool); - /// @notice This returns the status of a given validator function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS); @@ -170,24 +140,6 @@ interface IEigenPod { ) external; - /** - * @notice This function records an update (either increase or decrease) in the pod's balance in the StrategyManager. - It also verifies a merkle proof of the validator's current beacon chain balance. - * @param oracleTimestamp The oracleTimestamp whose state root the `proof` will be proven against. - * Must be within `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` of the current block. - * @param validatorIndices is the list of indices of the validators being proven, refer to consensus specs - * @param validatorFieldsProofs proofs against the `beaconStateRoot` for each validator in `validatorFields` - * @param validatorFields are the fields of the "Validator Container", refer to consensus specs - * @dev For more details on the Beacon Chain spec, see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator - */ - function verifyBalanceUpdates( - uint64 oracleTimestamp, - uint40[] calldata validatorIndices, - BeaconChainProofs.StateRootProof calldata stateRootProof, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields - ) external; - /** * @notice Called by the pod owner to activate restaking by withdrawing * all existing ETH from the pod and preventing further withdrawals via diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index 4860cff40..4080563c0 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -67,13 +67,6 @@ interface IEigenPodManager is IPausable { */ function recordBeaconChainETHBalanceUpdate(address podOwner, int256 sharesDelta) external; - /** - * @notice Updates the oracle contract that provides the beacon chain state root - * @param newBeaconChainOracle is the new oracle contract being pointed to - * @dev Callable only by the owner of this contract (i.e. governance) - */ - function updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) external; - /// @notice Returns the address of the `podOwner`'s EigenPod if it has been deployed. function ownerToPod(address podOwner) external view returns (IEigenPod); @@ -85,13 +78,7 @@ interface IEigenPodManager is IPausable { /// @notice Beacon proxy to which the EigenPods point function eigenPodBeacon() external view returns (IBeacon); - - /// @notice Oracle contract that provides updates to the beacon chain's state - function beaconChainOracle() external view returns (IBeaconChainOracle); - - /// @notice Returns the beacon block root at `timestamp`. Reverts if the Beacon block root at `timestamp` has not yet been finalized. - function getBlockRootAtTimestamp(uint64 timestamp) external view returns (bytes32); - + /// @notice EigenLayer's StrategyManager contract function strategyManager() external view returns (IStrategyManager); @@ -143,6 +130,24 @@ interface IEigenPodManager is IPausable { */ function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) external; + /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` + /// @param timestamp of the block for which the parent block root will be returned. MUST correspond + /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method + /// will revert. + function getParentBlockRoot(uint64 timestamp) external view returns (bytes32); + + /** + * @dev Changes the `podOwner's` stale validator count by `countDelta`. The stale validator + * count can be used as an additional weighting mechanism to determine a staker or operator's shares. + * @param podOwner the pod owner whose stale validator count is being updated + * @param countDelta the change in `podOwner's` stale validator count as a signed integer + * @dev Callable only by the `podOwner's` EigenPod contract + */ + function updateStaleValidatorCount( + address podOwner, + int256 countDelta + ) external; + /** * @notice the deneb hard fork timestamp used to determine which proof path to use for proving a withdrawal */ diff --git a/src/contracts/libraries/BeaconChainProofs.sol b/src/contracts/libraries/BeaconChainProofs.sol index 2c4b88662..d2fdec4ef 100644 --- a/src/contracts/libraries/BeaconChainProofs.sol +++ b/src/contracts/libraries/BeaconChainProofs.sol @@ -36,6 +36,8 @@ library BeaconChainProofs { uint256 internal constant WITHDRAWAL_FIELD_TREE_HEIGHT = 2; uint256 internal constant VALIDATOR_TREE_HEIGHT = 40; + //refer to the eigenlayer-cli proof library. Despite being the same dimensions as the validator tree, the balance tree is merkleized differently + uint256 internal constant BALANCE_TREE_HEIGHT = 38; // MAX_WITHDRAWALS_PER_PAYLOAD = 2**4, making tree height = 4 uint256 internal constant WITHDRAWALS_TREE_HEIGHT = 4; @@ -49,13 +51,15 @@ library BeaconChainProofs { uint256 internal constant BODY_ROOT_INDEX = 4; // in beacon state https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconstate uint256 internal constant VALIDATOR_TREE_ROOT_INDEX = 11; + uint256 internal constant BALANCE_INDEX = 12; uint256 internal constant HISTORICAL_SUMMARIES_INDEX = 27; // in validator https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator uint256 internal constant VALIDATOR_PUBKEY_INDEX = 0; uint256 internal constant VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX = 1; uint256 internal constant VALIDATOR_BALANCE_INDEX = 2; - uint256 internal constant VALIDATOR_WITHDRAWABLE_EPOCH_INDEX = 7; + uint256 internal constant VALIDATOR_SLASHED_INDEX = 3; + uint256 internal constant VALIDATOR_EXIT_EPOCH_INDEX = 6; // in execution payload header uint256 internal constant TIMESTAMP_INDEX = 9; @@ -80,21 +84,7 @@ library BeaconChainProofs { bytes8 internal constant UINT64_MASK = 0xffffffffffffffff; - /// @notice This struct contains the merkle proofs and leaves needed to verify a partial/full withdrawal - struct WithdrawalProof { - bytes withdrawalProof; - bytes slotProof; - bytes executionPayloadProof; - bytes timestampProof; - bytes historicalSummaryBlockRootProof; - uint64 blockRootIndex; - uint64 historicalSummaryIndex; - uint64 withdrawalIndex; - bytes32 blockRoot; - bytes32 slotRoot; - bytes32 timestampRoot; - bytes32 executionPayloadRoot; - } + uint64 internal constant FAR_FUTURE_EPOCH = type(uint64).max; /// @notice This struct contains the root and proof for verifying the state root against the oracle block root struct StateRootProof { @@ -102,6 +92,17 @@ library BeaconChainProofs { bytes proof; } + struct BalanceProof { + bytes32 pubkeyHash; + bytes32 balanceRoot; + bytes proof; + } + + struct ValidatorProof { + bytes32[] validatorFields; + bytes proof; + } + /** * @notice This function verifies merkle proofs of the fields of a certain validator against a beacon chain state root * @param validatorIndex the index of the proven validator @@ -144,6 +145,37 @@ library BeaconChainProofs { ); } + function verifyValidatorBalance( + bytes32 beaconStateRoot, + uint40 validatorIndex, + BalanceProof calldata proof + ) internal view returns (uint64 validatorBalanceGwei) { + require( + proof.proof.length == 32 * ((BALANCE_TREE_HEIGHT + 1) + BEACON_STATE_FIELD_TREE_HEIGHT), + "BeaconChainProofs.verifyValidatorBalance: Proof has incorrect length" + ); + + // Beacon chain balances are lists of uint64 values which are grouped together in 4s when merkleized + uint256 balanceIndex = uint256(validatorIndex / 4); + /** + * Note: Merkleization of the balance root tree uses MerkleizeWithMixin, i.e., the length of the array is hashed with the root of + * the array. Thus we shift the BALANCE_INDEX over by BALANCE_TREE_HEIGHT + 1 and not just BALANCE_TREE_HEIGHT. + */ + balanceIndex = (BALANCE_INDEX << (BALANCE_TREE_HEIGHT + 1)) | balanceIndex; + + require( + Merkle.verifyInclusionSha256({ + proof: proof.proof, + root: beaconStateRoot, + leaf: proof.balanceRoot, + index: balanceIndex + }), + "BeaconChainProofs.verifyValidatorBalance: Invalid merkle proof" + ); + + return getBalanceAtIndex(proof.balanceRoot, validatorIndex); + } + /** * @notice This function verifies the latestBlockHeader against the state root. the latestBlockHeader is * a tracked in the beacon state. @@ -172,148 +204,6 @@ library BeaconChainProofs { ); } - /** - * @notice This function verifies the slot and the withdrawal fields for a given withdrawal - * @param withdrawalProof is the provided set of merkle proofs - * @param withdrawalFields is the serialized withdrawal container to be proven - */ - function verifyWithdrawal( - bytes32 beaconStateRoot, - bytes32[] calldata withdrawalFields, - WithdrawalProof calldata withdrawalProof, - uint64 denebForkTimestamp - ) internal view { - require( - withdrawalFields.length == 2 ** WITHDRAWAL_FIELD_TREE_HEIGHT, - "BeaconChainProofs.verifyWithdrawal: withdrawalFields has incorrect length" - ); - - require( - withdrawalProof.blockRootIndex < 2 ** BLOCK_ROOTS_TREE_HEIGHT, - "BeaconChainProofs.verifyWithdrawal: blockRootIndex is too large" - ); - require( - withdrawalProof.withdrawalIndex < 2 ** WITHDRAWALS_TREE_HEIGHT, - "BeaconChainProofs.verifyWithdrawal: withdrawalIndex is too large" - ); - - require( - withdrawalProof.historicalSummaryIndex < 2 ** HISTORICAL_SUMMARIES_TREE_HEIGHT, - "BeaconChainProofs.verifyWithdrawal: historicalSummaryIndex is too large" - ); - - //Note: post deneb hard fork, the number of exection payload header fields increased from 15->17, adding an extra level to the tree height - uint256 executionPayloadHeaderFieldTreeHeight = (getWithdrawalTimestamp(withdrawalProof) < denebForkTimestamp) ? EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_CAPELLA : EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_DENEB; - require( - withdrawalProof.withdrawalProof.length == - 32 * (executionPayloadHeaderFieldTreeHeight + WITHDRAWALS_TREE_HEIGHT + 1), - "BeaconChainProofs.verifyWithdrawal: withdrawalProof has incorrect length" - ); - require( - withdrawalProof.executionPayloadProof.length == - 32 * (BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT + BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT), - "BeaconChainProofs.verifyWithdrawal: executionPayloadProof has incorrect length" - ); - require( - withdrawalProof.slotProof.length == 32 * (BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT), - "BeaconChainProofs.verifyWithdrawal: slotProof has incorrect length" - ); - require( - withdrawalProof.timestampProof.length == 32 * (executionPayloadHeaderFieldTreeHeight), - "BeaconChainProofs.verifyWithdrawal: timestampProof has incorrect length" - ); - - require( - withdrawalProof.historicalSummaryBlockRootProof.length == - 32 * - (BEACON_STATE_FIELD_TREE_HEIGHT + - (HISTORICAL_SUMMARIES_TREE_HEIGHT + 1) + - 1 + - (BLOCK_ROOTS_TREE_HEIGHT)), - "BeaconChainProofs.verifyWithdrawal: historicalSummaryBlockRootProof has incorrect length" - ); - /** - * Note: Here, the "1" in "1 + (BLOCK_ROOTS_TREE_HEIGHT)" signifies that extra step of choosing the "block_root_summary" within the individual - * "historical_summary". Everywhere else it signifies merkelize_with_mixin, where the length of an array is hashed with the root of the array, - * but not here. - */ - uint256 historicalBlockHeaderIndex = (HISTORICAL_SUMMARIES_INDEX << - ((HISTORICAL_SUMMARIES_TREE_HEIGHT + 1) + 1 + (BLOCK_ROOTS_TREE_HEIGHT))) | - (uint256(withdrawalProof.historicalSummaryIndex) << (1 + (BLOCK_ROOTS_TREE_HEIGHT))) | - (BLOCK_SUMMARY_ROOT_INDEX << (BLOCK_ROOTS_TREE_HEIGHT)) | - uint256(withdrawalProof.blockRootIndex); - - require( - Merkle.verifyInclusionSha256({ - proof: withdrawalProof.historicalSummaryBlockRootProof, - root: beaconStateRoot, - leaf: withdrawalProof.blockRoot, - index: historicalBlockHeaderIndex - }), - "BeaconChainProofs.verifyWithdrawal: Invalid historicalsummary merkle proof" - ); - - //Next we verify the slot against the blockRoot - require( - Merkle.verifyInclusionSha256({ - proof: withdrawalProof.slotProof, - root: withdrawalProof.blockRoot, - leaf: withdrawalProof.slotRoot, - index: SLOT_INDEX - }), - "BeaconChainProofs.verifyWithdrawal: Invalid slot merkle proof" - ); - - { - // Next we verify the executionPayloadRoot against the blockRoot - uint256 executionPayloadIndex = (BODY_ROOT_INDEX << (BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT)) | - EXECUTION_PAYLOAD_INDEX; - require( - Merkle.verifyInclusionSha256({ - proof: withdrawalProof.executionPayloadProof, - root: withdrawalProof.blockRoot, - leaf: withdrawalProof.executionPayloadRoot, - index: executionPayloadIndex - }), - "BeaconChainProofs.verifyWithdrawal: Invalid executionPayload merkle proof" - ); - } - - // Next we verify the timestampRoot against the executionPayload root - require( - Merkle.verifyInclusionSha256({ - proof: withdrawalProof.timestampProof, - root: withdrawalProof.executionPayloadRoot, - leaf: withdrawalProof.timestampRoot, - index: TIMESTAMP_INDEX - }), - "BeaconChainProofs.verifyWithdrawal: Invalid timestamp merkle proof" - ); - - { - /** - * Next we verify the withdrawal fields against the executionPayloadRoot: - * First we compute the withdrawal_index, then we merkleize the - * withdrawalFields container to calculate the withdrawalRoot. - * - * Note: Merkleization of the withdrawals root tree uses MerkleizeWithMixin, i.e., the length of the array is hashed with the root of - * the array. Thus we shift the WITHDRAWALS_INDEX over by WITHDRAWALS_TREE_HEIGHT + 1 and not just WITHDRAWALS_TREE_HEIGHT. - */ - uint256 withdrawalIndex = (WITHDRAWALS_INDEX << (WITHDRAWALS_TREE_HEIGHT + 1)) | - uint256(withdrawalProof.withdrawalIndex); - bytes32 withdrawalRoot = Merkle.merkleizeSha256(withdrawalFields); - require( - Merkle.verifyInclusionSha256({ - proof: withdrawalProof.withdrawalProof, - root: withdrawalProof.executionPayloadRoot, - leaf: withdrawalRoot, - index: withdrawalIndex - }), - "BeaconChainProofs.verifyWithdrawal: Invalid withdrawal merkle proof" - ); - } - } - /** * @notice This function replicates the ssz hashing of a validator's pubkey, outlined below: * hh := ssz.NewHasher() @@ -327,19 +217,18 @@ library BeaconChainProofs { } /** - * @dev Retrieve the withdrawal timestamp - */ - function getWithdrawalTimestamp(WithdrawalProof memory withdrawalProof) internal pure returns (uint64) { - return - Endian.fromLittleEndianUint64(withdrawalProof.timestampRoot); - } - - /** - * @dev Converts the withdrawal's slot to an epoch + * @notice Parses a balanceRoot to get the uint64 balance of a validator. + * @dev During merkleization of the beacon state balance tree, four uint64 values are treated as a single + * leaf in the merkle tree. We use validatorIndex % 4 to determine which of the four uint64 values to + * extract from the balanceRoot. + * @param balanceRoot is the combination of 4 validator balances being proven for + * @param validatorIndex is the index of the validator being proven for + * @return The validator's balance, in Gwei */ - function getWithdrawalEpoch(WithdrawalProof memory withdrawalProof) internal pure returns (uint64) { - return - Endian.fromLittleEndianUint64(withdrawalProof.slotRoot) / SLOTS_PER_EPOCH; + function getBalanceAtIndex(bytes32 balanceRoot, uint40 validatorIndex) internal pure returns (uint64) { + uint256 bitShiftAmount = (validatorIndex % 4) * 64; + return + Endian.fromLittleEndianUint64(bytes32((uint256(balanceRoot) << bitShiftAmount))); } /** @@ -376,11 +265,18 @@ library BeaconChainProofs { } /** - * @dev Retrieves a validator's withdrawable epoch + * @dev Returns true IFF the validator is marked slashed + */ + function getSlashStatus(bytes32[] memory validatorFields) internal pure returns (bool) { + return validatorFields[VALIDATOR_SLASHED_INDEX] != 0; + } + + /** + * @dev Retrieves a validator's exit epoch */ - function getWithdrawableEpoch(bytes32[] memory validatorFields) internal pure returns (uint64) { + function getExitEpoch(bytes32[] memory validatorFields) internal pure returns (uint64) { return - Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_WITHDRAWABLE_EPOCH_INDEX]); + Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_EXIT_EPOCH_INDEX]); } /** diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 63021e809..7ef862060 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -24,19 +24,17 @@ import "./EigenPodStorage.sol"; * @title The implementation contract used for restaking beacon chain ETH on EigenLayer * @author Layr Labs, Inc. * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service - * @notice The main functionalities are: - * - creating new ETH validators with their withdrawal credentials pointed to this contract - * - proving from beacon chain state roots that withdrawal credentials are pointed to this contract - * - proving from beacon chain state roots the balances of ETH validators with their withdrawal credentials - * pointed to this contract - * - updating aggregate balances in the EigenPodManager - * - withdrawing eth when withdrawals are initiated - * @notice This EigenPod Beacon Proxy implementation adheres to the current Capella consensus specs + * @notice This EigenPod Beacon Proxy implementation adheres to the current Deneb consensus specs * @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ -contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants { - +contract EigenPod is + Initializable, + ReentrancyGuardUpgradeable, + EigenPodPausingConstants, + EigenPodStorage +{ + using BytesLib for bytes; using SafeERC20 for IERC20; using BeaconChainProofs for *; @@ -48,12 +46,6 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, // @notice Internal constant used in calculations, since the beacon chain stores balances in Gwei rather than wei uint256 internal constant GWEI_TO_WEI = 1e9; - /** - * @notice Maximum "staleness" of a Beacon Chain state root against which `verifyBalanceUpdate` or `verifyWithdrawalCredentials` may be proven. - * We can't allow "stale" roots to be used for restaking as the validator may have been slashed in a more updated beacon state root. - */ - uint256 internal constant VERIFY_BALANCE_UPDATE_WINDOW_SECONDS = 4.5 hours; - /// @notice This is the beacon chain deposit contract IETHPOSDeposit public immutable ethPOS; @@ -63,12 +55,18 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, /// @notice The single EigenPodManager for EigenLayer IEigenPodManager public immutable eigenPodManager; - ///@notice The maximum amount of ETH, in gwei, a validator can have restaked in the eigenlayer - uint64 public immutable MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - /// @notice This is the genesis time of the beacon state, to help us calculate conversions between slot and timestamp uint64 public immutable GENESIS_TIME; + /// @notice If a validator is slashed on the beacon chain and their balance has not been checkpointed + /// within `TIME_TILL_STALE_BALANCE` of the current block, they are eligible to be marked "stale" + /// via `verifyStaleBalance`. + uint256 internal constant TIME_TILL_STALE_BALANCE = 2 weeks; + + /// @notice A `verifyStaleBalance` proof MUST be older than `STALENESS_GRACE_PERIOD`, to give time + /// to a pod owner to prove the slashed validator's balance + uint256 internal constant STALENESS_GRACE_PERIOD = 6 hours; + /******************************************************************************* MODIFIERS *******************************************************************************/ @@ -88,17 +86,12 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, _; } - /// @notice checks that hasRestaked is set to true by calling activateRestaking() - modifier hasEnabledRestaking() { - require(hasRestaked, "EigenPod.hasEnabledRestaking: restaking is not enabled"); - _; - } - - /// @notice Checks that `timestamp` is greater than or equal to the value stored in `mostRecentWithdrawalTimestamp` - modifier proofIsForValidTimestamp(uint64 timestamp) { + /// @notice Checks that `timestamp` is greater than or equal to `mostRecentWithdrawalTimestamp` + modifier afterRestaking(uint64 timestamp) { require( + hasRestaked && timestamp >= mostRecentWithdrawalTimestamp, - "EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp" + "EigenPod.afterRestaking: timestamp must be at or after restaking was activated" ); _; } @@ -124,13 +117,11 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, IETHPOSDeposit _ethPOS, IDelayedWithdrawalRouter _delayedWithdrawalRouter, IEigenPodManager _eigenPodManager, - uint64 _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, uint64 _GENESIS_TIME ) { ethPOS = _ethPOS; delayedWithdrawalRouter = _delayedWithdrawalRouter; eigenPodManager = _eigenPodManager; - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; GENESIS_TIME = _GENESIS_TIME; _disableInitializers(); } @@ -160,70 +151,134 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, } /** - * @notice This function records an update (either increase or decrease) in a validator's balance. - * @param oracleTimestamp The oracleTimestamp whose state root the proof will be proven against. - * Must be within `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` of the current block. - * @param validatorIndices is the list of indices of the validators being proven, refer to consensus specs - * @param stateRootProof proves a `beaconStateRoot` against a block root fetched from the oracle - * @param validatorFieldsProofs proofs against the `beaconStateRoot` for each validator in `validatorFields` - * @param validatorFields are the fields of the "Validator Container", refer to consensus specs - * @dev For more details on the Beacon Chain spec, see: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + * @dev Create a checkpoint used to prove this pod's active validator set. Checkpoints are completed + * by submitting one checkpoint proof per ACTIVE validator. During the checkpoint process, the total + * change in ACTIVE validator balance is tracked, and any validators with 0 balance are marked `WITHDRAWN`. + * @dev Once finalized, the pod owner is awarded shares corresponding to: + * - the total change in their ACTIVE validator balances + * - any ETH in the pod not already awarded shares. + * @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If + * this is the case, the pod owner MUST complete the existing checkpoint before starting a new one. */ - function verifyBalanceUpdates( - uint64 oracleTimestamp, - uint40[] calldata validatorIndices, - BeaconChainProofs.StateRootProof calldata stateRootProof, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields - ) external onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE) { + function startCheckpoint() + external + onlyEigenPodOwner() + onlyWhenNotPaused(PAUSED_START_CHECKPOINT) + afterRestaking(uint64(block.timestamp)) /// TODO - this is the wrong condition + { require( - (validatorIndices.length == validatorFieldsProofs.length) && (validatorFieldsProofs.length == validatorFields.length), - "EigenPod.verifyBalanceUpdates: validatorIndices and proofs must be same length" + currentCheckpointTimestamp == 0, + "EigenPod.startCheckpoint: must finish previous checkpoint before starting another" ); - // Balance updates should not be "stale" (older than VERIFY_BALANCE_UPDATE_WINDOW_SECONDS) + // Snapshot pod balance at the start of the checkpoint. Once the checkpoint is finalized, + // this amount will be added to the total validator balance delta and credited as shares. + uint256 podBalanceWei = + address(this).balance + - nonBeaconChainETHBalanceWei + - (withdrawableRestakedExecutionLayerGwei * GWEI_TO_WEI); + + Checkpoint memory checkpoint = Checkpoint({ + beaconBlockRoot: eigenPodManager.getParentBlockRoot(uint64(block.timestamp)), + beaconStateRoot: bytes32(0), + podBalanceGwei: podBalanceWei / GWEI_TO_WEI, + balanceDeltasGwei: 0, + proofsRemaining: activeValidatorCount + }); + + // Place checkpoint in storage + currentCheckpointTimestamp = uint64(block.timestamp); + _updateCheckpoint(checkpoint); + } + + /** + * @dev Progress the current checkpoint towards completion by submitting one or more validator + * checkpoint proofs. Anyone can call this method to submit proofs towards the current checkpoint. + * For each validator proven, the current checkpoint's `proofsRemaining` decreases. + * @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized. + * (see `_updateCheckpoint` for more details) + * @dev This method can only be called when there is a currently-active checkpoint. + * @param stateRootProof proves a beacon state root against the checkpoint's `beaconBlockRoot` + * @dev Note that if the `beaconStateRoot` has already been verified for this checkpoint, it does + * not need to be verfied again. + * @param proofs Proofs for one or more validator current balances against the checkpoint's `beaconStateRoot` + */ + function verifyCheckpointProofs( + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceProof[] calldata proofs + ) + external + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) + { + uint64 beaconTimestamp = currentCheckpointTimestamp; require( - oracleTimestamp + VERIFY_BALANCE_UPDATE_WINDOW_SECONDS >= block.timestamp, - "EigenPod.verifyBalanceUpdates: specified timestamp is too far in past" + beaconTimestamp != 0, + "EigenPod.verifyCheckpointProofs: must have active checkpoint to perform checkpoint proof" ); - // Verify passed-in beaconStateRoot against oracle-provided block root: - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getBlockRootAtTimestamp(oracleTimestamp), - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof - }); + Checkpoint memory checkpoint = currentCheckpoint; - int256 sharesDeltaGwei; - for (uint256 i = 0; i < validatorIndices.length; i++) { - sharesDeltaGwei += _verifyBalanceUpdate( - oracleTimestamp, - validatorIndices[i], - stateRootProof.beaconStateRoot, - validatorFieldsProofs[i], // Use validator fields proof because contains the effective balance - validatorFields[i] - ); + // If we haven't already proven a state root for this checkpoint, verify + // `stateRootProof` against the block root and cache the result + if (checkpoint.beaconStateRoot == bytes32(0)) { + BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ + latestBlockRoot: checkpoint.beaconBlockRoot, + beaconStateRoot: stateRootProof.beaconStateRoot, + stateRootProof: stateRootProof.proof + }); + + checkpoint.beaconStateRoot = stateRootProof.beaconStateRoot; } - eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, sharesDeltaGwei * int256(GWEI_TO_WEI)); - } - /******************************************************************************* - EXTERNAL FUNCTIONS CALLABLE BY EIGENPOD OWNER - *******************************************************************************/ + // Process each checkpoint proof submitted + int256 totalStaleValidatorsProven; + for (uint256 i = 0; i < proofs.length; i++) { + + // Process a checkpoint proof for a validator. + // - the validator MUST be in the ACTIVE state + // - the validator MUST NOT have already been proven for this checkpoint + // + // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. + // The assumption is that if this is the case, any withdrawn ETH was already in + // the pod when `startCheckpoint` was originally called. + (int256 balanceDeltaGwei, bool noLongerStale) = _verifyCheckpointProof({ + beaconTimestamp: beaconTimestamp, + beaconStateRoot: checkpoint.beaconStateRoot, + proof: proofs[i] + }); + + checkpoint.proofsRemaining--; + checkpoint.balanceDeltasGwei += balanceDeltaGwei; + + if (noLongerStale) { + totalStaleValidatorsProven++; + } + } + + // Update and/or finalize the checkpoint + _updateCheckpoint(checkpoint); + + if (totalStaleValidatorsProven != 0) { + eigenPodManager.updateStaleValidatorCount(podOwner, totalStaleValidatorsProven); + } + } /** - * @notice This function verifies that the withdrawal credentials of validator(s) owned by the podOwner are pointed to - * this contract. It also verifies the effective balance of the validator. It verifies the provided proof of the ETH validator against the beacon chain state - * root, marks the validator as 'active' in EigenLayer, and credits the restaked ETH in Eigenlayer. - * @param oracleTimestamp is the Beacon Chain timestamp whose state root the `proof` will be proven against. - * @param stateRootProof proves a `beaconStateRoot` against a block root fetched from the oracle - * @param validatorIndices is the list of indices of the validators being proven, refer to consensus specs - * @param validatorFieldsProofs proofs against the `beaconStateRoot` for each validator in `validatorFields` - * @param validatorFields are the fields of the "Validator Container", refer to consensus specs - * for details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award + * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and + * future checkpoint proofs will need to include them. + * @dev Withdrawal credential proofs MUST NOT be older than the `lastFinalizedCheckpoint` OR `currentCheckpointTimestamp`. + * @dev Validators proven via this method MUST NOT have an exit epoch set already. + * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds + * to the parent beacon block root against which the proof is verified. + * @param stateRootProof proves a beacon state root against a beacon block root + * @param validatorIndices a list of validator indices being proven stale + * @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root + * @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for + * details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator */ function verifyWithdrawalCredentials( - uint64 oracleTimestamp, + uint64 beaconTimestamp, BeaconChainProofs.StateRootProof calldata stateRootProof, uint40[] calldata validatorIndices, bytes[] calldata validatorFieldsProofs, @@ -232,37 +287,26 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, external onlyEigenPodOwner onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - // ensure that caller has previously enabled restaking by calling `activateRestaking()` - hasEnabledRestaking - { + afterRestaking(beaconTimestamp) + { require( (validatorIndices.length == validatorFieldsProofs.length) && (validatorFieldsProofs.length == validatorFields.length), "EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length" ); - // `mostRecentWithdrawalTimestamp` will be 0 for any pods deployed after M2 - // If this is non-zero, ensure `oracleTimestamp` is from the epoch AFTER `activateRestaking` - // was called. - require( - mostRecentWithdrawalTimestamp == 0 || - oracleTimestamp >= _nextEpochStartTimestamp(_timestampToEpoch(mostRecentWithdrawalTimestamp)), - "EigenPod.verifyWithdrawalCredentials: proof must be in the epoch after activation" - ); - - /** - * Withdrawal credential proof should not be "stale" (older than VERIFY_BALANCE_UPDATE_WINDOW_SECONDS) as we are doing a balance check here - * The validator container persists as the state evolves and even after the validator exits. So we can use a more "fresh" credential proof within - * the VERIFY_BALANCE_UPDATE_WINDOW_SECONDS window, not just the first proof where the validator container is registered in the state. - */ + // TODO - is == valid? + // I think YES, because we enforce no exit epoch is set + // However, we could also do strictly greater than if we want to be safe. + // TODO pt 2 - what about sub 12 on checkpointTimestamp? require( - oracleTimestamp + VERIFY_BALANCE_UPDATE_WINDOW_SECONDS >= block.timestamp, + beaconTimestamp > lastFinalizedCheckpoint && beaconTimestamp > currentCheckpointTimestamp, "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" ); // Verify passed-in beaconStateRoot against oracle-provided block root: BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getBlockRootAtTimestamp(oracleTimestamp), + latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), beaconStateRoot: stateRootProof.beaconStateRoot, stateRootProof: stateRootProof.proof }); @@ -270,7 +314,7 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, uint256 totalAmountToBeRestakedWei; for (uint256 i = 0; i < validatorIndices.length; i++) { totalAmountToBeRestakedWei += _verifyWithdrawalCredentials( - oracleTimestamp, + beaconTimestamp, stateRootProof.beaconStateRoot, validatorIndices[i], validatorFieldsProofs[i], @@ -282,6 +326,89 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, int256(totalAmountToBeRestakedWei)); } + /** + * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely + * checkpoint proofs since being slashed. If successful, this increases the pod owner's `staleValidatorCount` + * in the `EigenPodManager`. Stale validators can be restored by proving their balance in a checkpoint via + * `startCheckpoint` and `verifyCheckpointProofs`. + * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds + * to the parent beacon block root against which the proof is verified. + * @param stateRootProof proves a beacon state root against a beacon block root + * @param proofs the fields of the beacon chain "Validator" container, along with a merkle proof against + * the beacon state root. See the consensus specs for more details: + * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + * + * @dev Staleness conditions: + * - `beaconTimestamp` MUST NOT fall within `STALENESS_GRACE_PERIOD` seconds of `block.timestamp` + * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` + * - Validator MUST be in `ACTIVE` status in the pod + * - Validator MUST NOT already be marked stale + * - Validator MUST be slashed on the beacon chain + */ + function verifyStaleBalances( + uint64 beaconTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.ValidatorProof[] calldata proofs + ) + external + onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) + { + require( + beaconTimestamp + STALENESS_GRACE_PERIOD < block.timestamp, + "EigenPod.verifyStaleBalance: staleness grace period not elapsed" + ); + + // Process each staleness proof + for (uint256 i = 0; i < proofs.length; i++) { + bytes32 validatorPubkey = proofs[i].validatorFields.getPubkeyHash(); + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkey]; + + // Validator must be eligible for a staleness proof + require( + beaconTimestamp > validatorInfo.mostRecentBalanceUpdateTimestamp + TIME_TILL_STALE_BALANCE, + "EigenPod.verifyStaleBalance: validator balance is not stale yet" + ); + + // Validator must be checkpoint-able + require( + validatorInfo.status == VALIDATOR_STATUS.ACTIVE, + "EigenPod.verifyStaleBalance: validator is not active" + ); + + // Validator should not already be stale + require( + !isValidatorStale[validatorPubkey], + "EigenPod.verifyStaleBalance: validator already marked stale" + ); + + // Validator must be slashed on the beacon chain + require( + proofs[i].validatorFields.getSlashStatus() == true, + "EigenPod.verifyStaleBalance: validator must be slashed to be marked stale" + ); + + // Verify `beaconStateRoot` against beacon block root + BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ + latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), + beaconStateRoot: stateRootProof.beaconStateRoot, + stateRootProof: stateRootProof.proof + }); + + // Verify Validator container proof against `beaconStateRoot` + BeaconChainProofs.verifyValidatorFields({ + beaconStateRoot: stateRootProof.beaconStateRoot, + validatorFields: proofs[i].validatorFields, + validatorFieldsProof: proofs[i].proof, + validatorIndex: uint40(validatorInfo.validatorIndex) + }); + + isValidatorStale[validatorPubkey] = true; + } + + // Increment stale validator count by one for each successful proof + eigenPodManager.updateStaleValidatorCount(podOwner, int256(proofs.length)); + } + /// @notice Called by the pod owner to withdraw the nonBeaconChainETHBalanceWei function withdrawNonBeaconChainETHBalanceWei( address recipient, @@ -333,10 +460,6 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, _processWithdrawalBeforeRestaking(podOwner); } - /******************************************************************************* - EXTERNAL FUNCTIONS CALLABLE BY EIGENPODMANAGER - *******************************************************************************/ - /// @notice Called by EigenPodManager when the owner wants to create another ETH validator. function stake( bytes calldata pubkey, @@ -372,13 +495,13 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, /** * @notice internal function that proves an individual validator's withdrawal credentials - * @param oracleTimestamp is the timestamp whose state root the `proof` will be proven against. + * @param beaconTimestamp is the timestamp whose state root the `proof` will be proven against. * @param validatorIndex is the index of the validator being proven * @param validatorFieldsProof is the bytes that prove the ETH validator's withdrawal credentials against a beacon chain state root * @param validatorFields are the fields of the "Validator Container", refer to consensus specs */ function _verifyWithdrawalCredentials( - uint64 oracleTimestamp, + uint64 beaconTimestamp, bytes32 beaconStateRoot, uint40 validatorIndex, bytes calldata validatorFieldsProof, @@ -390,24 +513,25 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, // Withdrawal credential proofs should only be processed for "INACTIVE" validators require( validatorInfo.status == VALIDATOR_STATUS.INACTIVE, - "EigenPod.verifyCorrectWithdrawalCredentials: Validator must be inactive to prove withdrawal credentials" + "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" ); - // Ensure the `validatorFields` we're proving have the correct withdrawal credentials + // Validator should not already be in the process of exiting + require( + validatorFields.getExitEpoch() == BeaconChainProofs.FAR_FUTURE_EPOCH, + "EigenPod._verifyWithdrawalCredentials: validator must not be exiting" + ); + + // Ensure the validator's withdrawal credentials are pointed at this pod require( validatorFields.getWithdrawalCredentials() == bytes32(_podWithdrawalCredentials()), - "EigenPod.verifyCorrectWithdrawalCredentials: Proof is not for this EigenPod" + "EigenPod._verifyWithdrawalCredentials: proof is not for this EigenPod" ); - /** - * Deserialize the balance field from the Validator struct. Note that this is the "effective" balance of the validator - * rather than the current balance. Effective balance is generated via a hystersis function such that an effective - * balance, always a multiple of 1 ETH, will only lower to the next multiple of 1 ETH if the current balance is less - * than 0.25 ETH below their current effective balance. For example, if the effective balance is 31ETH, it only falls to - * 30ETH when the true balance falls below 30.75ETH. Thus in the worst case, the effective balance is overestimating the - * actual validator balance by 0.25 ETH. - */ - uint64 validatorEffectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); + // Get the validator's effective balance. Note that this method uses effective balance, while + // `verifyBalanceUpdates` uses current balance. Effective balance is updated per-epoch - so it's + // less accurate, but is good enough for verifying withdrawal credentials. + uint64 restakedBalanceGwei = validatorFields.getEffectiveBalanceGwei(); // Verify passed-in validatorFields against verified beaconStateRoot: BeaconChainProofs.verifyValidatorFields({ @@ -421,85 +545,106 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, activeValidatorCount++; validatorInfo.status = VALIDATOR_STATUS.ACTIVE; validatorInfo.validatorIndex = validatorIndex; - validatorInfo.mostRecentBalanceUpdateTimestamp = oracleTimestamp; + validatorInfo.mostRecentBalanceUpdateTimestamp = beaconTimestamp; + validatorInfo.restakedBalanceGwei = restakedBalanceGwei; - if (validatorEffectiveBalanceGwei > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) { - validatorInfo.restakedBalanceGwei = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - } else { - validatorInfo.restakedBalanceGwei = validatorEffectiveBalanceGwei; - } _validatorPubkeyHashToInfo[validatorPubkeyHash] = validatorInfo; emit ValidatorRestaked(validatorIndex); - emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, validatorInfo.restakedBalanceGwei); + emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, restakedBalanceGwei); - return validatorInfo.restakedBalanceGwei * GWEI_TO_WEI; + return restakedBalanceGwei * GWEI_TO_WEI; } - function _verifyBalanceUpdate( - uint64 oracleTimestamp, - uint40 validatorIndex, + function _verifyCheckpointProof( + uint64 beaconTimestamp, bytes32 beaconStateRoot, - bytes calldata validatorFieldsProof, - bytes32[] calldata validatorFields - ) internal returns(int256 sharesDeltaGwei){ - uint64 validatorEffectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); - bytes32 validatorPubkeyHash = validatorFields.getPubkeyHash(); - ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkeyHash]; + BeaconChainProofs.BalanceProof calldata proof + ) internal returns (int256 balanceDeltaGwei, bool noLongerStale) { + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proof.pubkeyHash]; - // 1. Balance updates should be more recent than the most recent update require( - validatorInfo.mostRecentBalanceUpdateTimestamp < oracleTimestamp, - "EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp" + validatorInfo.status == VALIDATOR_STATUS.ACTIVE, + "EigenPod._verifyCheckpointProof: validator must be ACTIVE" ); - // 2. Balance updates should only be performed on "ACTIVE" validators + // Ensure we aren't proving a validator twice for the same checkpoint. This will fail if: + // - validator submitted twice during this checkpoint + // - validator withdrawal credentials verified after checkpoint starts, then submitted + // as a checkpoint proof + // TODO - we might want to "skip" and emit an event, rather than revert? require( - validatorInfo.status == VALIDATOR_STATUS.ACTIVE, - "EigenPod.verifyBalanceUpdate: Validator not active" + validatorInfo.mostRecentBalanceUpdateTimestamp < beaconTimestamp, + "EigenPod._verifyCheckpointProof: validator already proven for this checkpoint" ); - - // 3. Balance updates should only be made before a validator is fully withdrawn. - // -- A withdrawable validator may not have withdrawn yet, so we require their balance is nonzero - // -- A fully withdrawn validator should withdraw via verifyAndProcessWithdrawals - if (validatorFields.getWithdrawableEpoch() <= _timestampToEpoch(oracleTimestamp)) { - require( - validatorEffectiveBalanceGwei > 0, - "EigenPod.verifyBalanceUpdate: validator is withdrawable but has not withdrawn" - ); - } - - // Verify passed-in validatorFields against verified beaconStateRoot: - BeaconChainProofs.verifyValidatorFields({ + + // Verify validator balance against beaconStateRoot + uint64 prevBalanceGwei = validatorInfo.restakedBalanceGwei; + uint64 newBalanceGwei = BeaconChainProofs.verifyValidatorBalance({ beaconStateRoot: beaconStateRoot, - validatorFields: validatorFields, - validatorFieldsProof: validatorFieldsProof, - validatorIndex: validatorIndex + validatorIndex: uint40(validatorInfo.validatorIndex), + proof: proof }); + + // Update validator state. If their new balance is 0, they are marked `WITHDRAWN` + validatorInfo.restakedBalanceGwei = newBalanceGwei; + validatorInfo.mostRecentBalanceUpdateTimestamp = beaconTimestamp; + if (newBalanceGwei == 0) { + activeValidatorCount--; + validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; + } - // Done with proofs! Now update the validator's balance and send to the EigenPodManager if needed + _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; - uint64 currentRestakedBalanceGwei = validatorInfo.restakedBalanceGwei; - uint64 newRestakedBalanceGwei; - if (validatorEffectiveBalanceGwei > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) { - newRestakedBalanceGwei = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - } else { - newRestakedBalanceGwei = validatorEffectiveBalanceGwei; + // Calculate change in the validator's balance since the last proof + if (newBalanceGwei != prevBalanceGwei) { + emit ValidatorBalanceUpdated(uint40(validatorInfo.validatorIndex), beaconTimestamp, newBalanceGwei); + + balanceDeltaGwei = _calcBalanceDelta({ + newAmountGwei: newBalanceGwei, + previousAmountGwei: prevBalanceGwei + }); } - - // Update validator balance and timestamp, and save to state: - validatorInfo.restakedBalanceGwei = newRestakedBalanceGwei; - validatorInfo.mostRecentBalanceUpdateTimestamp = oracleTimestamp; - _validatorPubkeyHashToInfo[validatorPubkeyHash] = validatorInfo; - // If our new and old balances differ, calculate the delta and send to the EigenPodManager - if (newRestakedBalanceGwei != currentRestakedBalanceGwei) { - emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, newRestakedBalanceGwei); + // If the validator was marked stale and this proof is younger than + // `TIME_TILL_STALE_BALANCE`, the validator is no longer stale. + if ( + beaconTimestamp + TIME_TILL_STALE_BALANCE >= block.timestamp && + isValidatorStale[proof.pubkeyHash] + ) { + isValidatorStale[proof.pubkeyHash] = false; + noLongerStale = true; + } - sharesDeltaGwei = _calculateSharesDelta({ - newAmountGwei: newRestakedBalanceGwei, - previousAmountGwei: currentRestakedBalanceGwei - }); + return (balanceDeltaGwei, noLongerStale); + } + + /** + * @dev Finish progress on a checkpoint and store it in state. + * @dev If the checkpoint has no proofs remaining, it is finalized: + * - a share delta is calculated and sent to the `EigenPodManager` + * - the checkpointed `podBalance` is added to `withdrawableRestakedExecutionLayerGwei` + * - `lastFinalizedCheckpoint` is updated + * - `currentCheckpoint` and `currentCheckpointTimestamp` are deleted + */ + function _updateCheckpoint(Checkpoint memory checkpoint) internal { + if (checkpoint.proofsRemaining == 0) { + int256 totalShareDeltaWei = + (int256(checkpoint.podBalanceGwei) + checkpoint.balanceDeltasGwei) * int256(GWEI_TO_WEI); + + // Add any native ETH in the pod to `withdrawableRestakedExecutionLayerGwei` + // ... this amount can be withdrawn via the `DelegationManager` withdrawal queue + withdrawableRestakedExecutionLayerGwei += uint64(checkpoint.podBalanceGwei); + + // Finalize the checkpoint + lastFinalizedCheckpoint = currentCheckpointTimestamp; + delete currentCheckpointTimestamp; + delete currentCheckpoint; + + // Update pod owner's shares + eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, totalShareDeltaWei); + } else { + currentCheckpoint = checkpoint; } } @@ -527,32 +672,12 @@ contract EigenPod is EigenPodStorage, Initializable, ReentrancyGuardUpgradeable, return sha256(abi.encodePacked(validatorPubkey, bytes16(0))); } - /** - * Calculates delta between two share amounts and returns as an int256 - */ - function _calculateSharesDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int256) { + /// @dev Calculates the delta between two Gwei amounts, converts to Wei, and returns as an int256 + function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int256) { return int256(uint256(newAmountGwei)) - int256(uint256(previousAmountGwei)); } - /** - * @dev Converts a timestamp to a beacon chain epoch by calculating the number of - * seconds since genesis, and dividing by seconds per epoch. - * reference: https://github.com/ethereum/consensus-specs/blob/ce240ca795e257fc83059c4adfd591328c7a7f21/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot - */ - function _timestampToEpoch(uint64 timestamp) internal view returns (uint64) { - require(timestamp >= GENESIS_TIME, "EigenPod._timestampToEpoch: timestamp is before genesis"); - return (timestamp - GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; - } - - /** - * @dev Given an epoch number, calculates the timestamp of the first slot in the following epoch - */ - function _nextEpochStartTimestamp(uint64 epoch) internal view returns (uint64) { - return - GENESIS_TIME + ((1 + epoch) * BeaconChainProofs.SECONDS_PER_EPOCH); - } - /******************************************************************************* VIEW FUNCTIONS *******************************************************************************/ diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index f28f9fc7b..ea6775d9a 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -55,12 +55,10 @@ contract EigenPodManager is } function initialize( - IBeaconChainOracle _beaconChainOracle, address initialOwner, IPauserRegistry _pauserRegistry, uint256 _initPausedStatus ) external initializer { - _updateBeaconChainOracle(_beaconChainOracle); _transferOwnership(initialOwner); _initializePauser(_pauserRegistry, _initPausedStatus); } @@ -141,6 +139,34 @@ contract EigenPodManager is emit PodSharesUpdated(podOwner, sharesDelta); } + /** + * @dev Changes the `podOwner's` stale validator count by `countDelta`. The stale validator + * count can be used as an additional weighting mechanism to determine a staker or operator's shares. + * @param podOwner the pod owner whose stale validator count is being updated + * @param countDelta the change in `podOwner's` stale validator count as a signed integer + * @dev Callable only by the `podOwner's` EigenPod contract + */ + function updateStaleValidatorCount( + address podOwner, + int256 countDelta + ) external onlyEigenPod(podOwner) { + require(podOwner != address(0), "EigenPodManager.updateStaleValidatorCount: podOwner cannot be zero address"); + require(countDelta != 0, "EigenPodManager.updateStaleValidatorCount: invalid countDelta"); + + uint256 currentCount = staleValidatorCount[podOwner]; + uint256 deltaAbs = uint256(countDelta); + + if (countDelta < 0) { + require(deltaAbs <= currentCount, "EigenPodManager.updateStaleValidatorCount: applying countDelta would make count negative"); + + staleValidatorCount[podOwner] -= deltaAbs; + } else { + staleValidatorCount[podOwner] += deltaAbs; + } + + // TODO emit event + } + /** * @notice Used by the DelegationManager to remove a pod owner's shares while they're in the withdrawal queue. * Simply decreases the `podOwner`'s shares by `shares`, down to a minimum of zero. @@ -221,15 +247,6 @@ contract EigenPodManager is ownerToPod[podOwner].withdrawRestakedBeaconChainETH(destination, shares); } - /** - * @notice Updates the oracle contract that provides the beacon chain state root - * @param newBeaconChainOracle is the new oracle contract being pointed to - * @dev Callable only by the owner of this contract (i.e. governance) - */ - function updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) external onlyOwner { - _updateBeaconChainOracle(newBeaconChainOracle); - } - /** * @notice Sets the timestamp of the Deneb fork. * @param newDenebForkTimestamp is the new timestamp of the Deneb fork @@ -262,12 +279,6 @@ contract EigenPodManager is return pod; } - /// @notice Internal setter for `beaconChainOracle` that also emits an event - function _updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) internal { - beaconChainOracle = newBeaconChainOracle; - emit BeaconOracleUpdated(address(newBeaconChainOracle)); - } - /** * @notice Calculates the change in a pod owner's delegateable shares as a result of their beacon chain ETH shares changing * from `sharesBefore` to `sharesAfter`. The key concept here is that negative/"deficit" shares are not delegateable. @@ -314,14 +325,24 @@ contract EigenPodManager is return address(ownerToPod[podOwner]) != address(0); } - /// @notice Returns the Beacon block root at `timestamp`. Reverts if the Beacon block root at `timestamp` has not yet been finalized. - function getBlockRootAtTimestamp(uint64 timestamp) external view returns (bytes32) { - bytes32 stateRoot = beaconChainOracle.timestampToBlockRoot(timestamp); + /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` + /// @param timestamp of the block for which the parent block root will be returned. MUST correspond + /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method + /// will revert. + function getParentBlockRoot(uint64 timestamp) external view returns (bytes32) { require( - stateRoot != bytes32(0), - "EigenPodManager.getBlockRootAtTimestamp: state root at timestamp not yet finalized" + block.timestamp - timestamp < BEACON_ROOTS_HISTORY_BUFFER_LENGTH * 12, + "EigenPodManager.getParentBlockRoot: timestamp out of range" ); - return stateRoot; + + (bool success, bytes memory result) = + BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); + + if (success && result.length > 0) { + return abi.decode(result, (bytes32)); + } else { + revert("EigenPodManager.getParentBlockRoot: invalid block root returned"); + } } /** diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index 39c98f2c2..44fa69835 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -11,6 +11,11 @@ import "../interfaces/IETHPOSDeposit.sol"; import "../interfaces/IEigenPod.sol"; abstract contract EigenPodManagerStorage is IEigenPodManager { + + /******************************************************************************* + CONSTANTS / IMMUTABLES + *******************************************************************************/ + /// @notice The ETH2 Deposit Contract IETHPOSDeposit public immutable ethPOS; @@ -40,8 +45,19 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { /// @notice Canonical, virtual beacon chain ETH strategy IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); - /// @notice Oracle contract that provides updates to the beacon chain's state - IBeaconChainOracle public beaconChainOracle; + /// @notice The address of the EIP-4788 beacon block root oracle + /// (See https://eips.ethereum.org/EIPS/eip-4788) + address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; + + /// @notice The length of the EIP-4799 beacon block root ring buffer + uint256 internal constant BEACON_ROOTS_HISTORY_BUFFER_LENGTH = 8191; + + /******************************************************************************* + STATE VARIABLES + *******************************************************************************/ + + /// @notice [DEPRECATED] Previously used to query beacon block roots. We now use eip-4788 directly + IBeaconChainOracle internal __deprecated_beaconChainOracle; /// @notice Pod owner to deployed EigenPod address mapping(address => IEigenPod) public ownerToPod; @@ -50,7 +66,7 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { /// @notice The number of EigenPods that have been deployed uint256 public numPods; - /// @notice Deprecated from old mainnet release. Was initially used to limit growth early on but there is no longer + /// @notice [DEPRECATED] Was initially used to limit growth early on but there is no longer /// a maximum number of EigenPods that can be deployed. uint256 private __deprecated_maxPods; @@ -67,6 +83,9 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { uint64 internal _denebForkTimestamp; + /// @dev Maps pod owner address -> number of validators with stale balances + mapping(address => uint256) public staleValidatorCount; + constructor( IETHPOSDeposit _ethPOS, IBeacon _eigenPodBeacon, @@ -86,5 +105,5 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[44] private __gap; + uint256[43] private __gap; } diff --git a/src/contracts/pods/EigenPodPausingConstants.sol b/src/contracts/pods/EigenPodPausingConstants.sol index f7eca3ece..4bd0d5d6e 100644 --- a/src/contracts/pods/EigenPodPausingConstants.sol +++ b/src/contracts/pods/EigenPodPausingConstants.sol @@ -17,10 +17,20 @@ abstract contract EigenPodPausingConstants { /// @notice Index for flag that pauses the deposit related functions *of the EigenPods* when set. see EigenPod code for details. uint8 internal constant PAUSED_EIGENPODS_VERIFY_CREDENTIALS = 2; - /// @notice Index for flag that pauses the `verifyBalanceUpdate` function *of the EigenPods* when set. see EigenPod code for details. - uint8 internal constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3; - /// @notice Index for flag that pauses the `verifyBeaconChainFullWithdrawal` function *of the EigenPods* when set. see EigenPod code for details. - uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; + + // Deprecated + // uint8 internal constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3; + + // Deprecated + // uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; + /// @notice Pausability for EigenPod's "accidental transfer" withdrawal methods uint8 internal constant PAUSED_NON_PROOF_WITHDRAWALS = 5; + + uint8 internal constant PAUSED_START_CHECKPOINT = 6; + + /// @notice Index for flag that pauses the `verifyCheckpointProofs` function *of the EigenPods* when set. see EigenPod code for details. + uint8 internal constant PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS = 7; + + uint8 internal constant PAUSED_VERIFY_STALE_BALANCE = 8; } diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 439d85162..5c2904b1f 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -22,7 +22,7 @@ abstract contract EigenPodStorage is IEigenPod { bool public hasRestaked; /// @notice This is a mapping of validatorPubkeyHash to timestamp to whether or not they have proven a withdrawal for that timestamp - mapping(bytes32 => mapping(uint64 => bool)) public provenWithdrawal; + mapping(bytes32 => mapping(uint64 => bool)) public __deprecated_provenWithdrawal; /// @notice This is a mapping that tracks a validator's information by their pubkey hash mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; @@ -31,15 +31,27 @@ abstract contract EigenPodStorage is IEigenPod { uint256 public nonBeaconChainETHBalanceWei; /// @notice This variable tracks the total amount of partial withdrawals claimed via merkle proofs prior to a switch to ZK proofs for claiming partial withdrawals - uint64 public sumOfPartialWithdrawalsClaimedGwei; + uint64 __deprecated_sumOfPartialWithdrawalsClaimedGwei; /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals - uint256 activeValidatorCount; + uint256 public activeValidatorCount; + + /// @notice The timestamp of the last checkpoint finalized + uint64 public lastFinalizedCheckpoint; + + /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint + uint64 public currentCheckpointTimestamp; + + /// @notice The current checkpoint, if there is one active + Checkpoint public currentCheckpoint; + + /// @notice Maps pubkey hash -> whether a validator has been marked "stale" + mapping(bytes32 => bool) public isValidatorStale; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[44] private __gap; + uint256[37] private __gap; } \ No newline at end of file diff --git a/src/test/DepositWithdraw.t.sol b/src/test/DepositWithdraw.t.sol index 50fb7b8d3..b29e63d47 100644 --- a/src/test/DepositWithdraw.t.sol +++ b/src/test/DepositWithdraw.t.sol @@ -367,7 +367,7 @@ contract DepositWithdrawTests is EigenLayerTestHelper { ); ethPOSDeposit = new ETHPOSDepositMock(); - pod = new EigenPod(ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME); + pod = new EigenPod(ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME); eigenPodBeacon = new UpgradeableBeacon(address(pod)); @@ -416,7 +416,6 @@ contract DepositWithdrawTests is EigenLayerTestHelper { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - beaconChainOracleAddress, eigenLayerReputedMultisig, eigenLayerPauserReg, 0/*initialPausedStatus*/ diff --git a/src/test/EigenLayerDeployer.t.sol b/src/test/EigenLayerDeployer.t.sol index 5912edb24..f55df602a 100644 --- a/src/test/EigenLayerDeployer.t.sol +++ b/src/test/EigenLayerDeployer.t.sol @@ -79,7 +79,6 @@ contract EigenLayerDeployer is Operators { uint32 PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS = 7 days / 12 seconds; uint256 REQUIRED_BALANCE_WEI = 32 ether; uint64 MAX_PARTIAL_WTIHDRAWAL_AMOUNT_GWEI = 1 ether / 1e9; - uint64 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9; uint64 GOERLI_GENESIS_TIME = 1616508000; address pauser; @@ -170,7 +169,6 @@ contract EigenLayerDeployer is Operators { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -244,7 +242,6 @@ contract EigenLayerDeployer is Operators { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -303,7 +300,6 @@ contract EigenLayerDeployer is Operators { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - beaconChainOracleAddress, eigenLayerReputedMultisig, eigenLayerPauserReg, 0 /*initialPausedStatus*/ diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index 0759981a1..e52e9b5be 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -162,7 +162,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ethPOSDeposit, delayedWithdrawalRouter, IEigenPodManager(podManagerAddress), - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -557,337 +556,337 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { require(address(pod).balance == 0, "Pod balance should be 0"); } - function testFullWithdrawalProof() public { - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - BeaconChainProofs.WithdrawalProof memory proofs = _getWithdrawalProof(); - bytes32 beaconStateRoot = getBeaconStateRoot(); - withdrawalFields = getWithdrawalFields(); - validatorFields = getValidatorFields(); + // function testFullWithdrawalProof() public { + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // BeaconChainProofs.WithdrawalProof memory proofs = _getWithdrawalProof(); + // bytes32 beaconStateRoot = getBeaconStateRoot(); + // withdrawalFields = getWithdrawalFields(); + // validatorFields = getValidatorFields(); - Relayer relay = new Relayer(); + // Relayer relay = new Relayer(); - relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs); - } + // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs); + // } - function testFullWithdrawalProofWithWrongIndices( - uint64 wrongBlockRootIndex, - uint64 wrongWithdrawalIndex, - uint64 wrongHistoricalSummariesIndex - ) public { - uint256 BLOCK_ROOTS_TREE_HEIGHT = 13; - uint256 WITHDRAWALS_TREE_HEIGHT = 4; - uint256 HISTORICAL_SUMMARIES_TREE_HEIGHT = 24; - cheats.assume(wrongBlockRootIndex > 2 ** BLOCK_ROOTS_TREE_HEIGHT); - cheats.assume(wrongWithdrawalIndex > 2 ** WITHDRAWALS_TREE_HEIGHT); - cheats.assume(wrongHistoricalSummariesIndex > 2 ** HISTORICAL_SUMMARIES_TREE_HEIGHT); + // function testFullWithdrawalProofWithWrongIndices( + // uint64 wrongBlockRootIndex, + // uint64 wrongWithdrawalIndex, + // uint64 wrongHistoricalSummariesIndex + // ) public { + // uint256 BLOCK_ROOTS_TREE_HEIGHT = 13; + // uint256 WITHDRAWALS_TREE_HEIGHT = 4; + // uint256 HISTORICAL_SUMMARIES_TREE_HEIGHT = 24; + // cheats.assume(wrongBlockRootIndex > 2 ** BLOCK_ROOTS_TREE_HEIGHT); + // cheats.assume(wrongWithdrawalIndex > 2 ** WITHDRAWALS_TREE_HEIGHT); + // cheats.assume(wrongHistoricalSummariesIndex > 2 ** HISTORICAL_SUMMARIES_TREE_HEIGHT); - Relayer relay = new Relayer(); + // Relayer relay = new Relayer(); - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - bytes32 beaconStateRoot = getBeaconStateRoot(); - validatorFields = getValidatorFields(); - withdrawalFields = getWithdrawalFields(); + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // bytes32 beaconStateRoot = getBeaconStateRoot(); + // validatorFields = getValidatorFields(); + // withdrawalFields = getWithdrawalFields(); - { - BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - wrongProofs.blockRootIndex = wrongBlockRootIndex; - cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: blockRootIndex is too large")); - relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - } + // { + // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); + // wrongProofs.blockRootIndex = wrongBlockRootIndex; + // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: blockRootIndex is too large")); + // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); + // } - { - BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - wrongProofs.withdrawalIndex = wrongWithdrawalIndex; - cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: withdrawalIndex is too large")); - relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - } + // { + // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); + // wrongProofs.withdrawalIndex = wrongWithdrawalIndex; + // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: withdrawalIndex is too large")); + // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); + // } - { - BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - wrongProofs.historicalSummaryIndex = wrongHistoricalSummariesIndex; - cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: historicalSummaryIndex is too large")); - relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - } - } + // { + // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); + // wrongProofs.historicalSummaryIndex = wrongHistoricalSummariesIndex; + // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: historicalSummaryIndex is too large")); + // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); + // } + // } /// @notice This test is to ensure the full withdrawal flow works - function testFullWithdrawalFlowDeneb() public returns (IEigenPod) { - eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP_GOERLI); - IS_DENEB = true; - //this call is to ensure that validator 302913 has proven their withdrawalcreds - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false false - // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - setJSON("./src/test/test-data/fullWithdrawalDeneb.json"); - return _proveWithdrawalForPod(newPod); - } - - function testFullWithdrawalFlowCapellaWithdrawalAgainstDenebRoot() public returns (IEigenPod) { - IS_DENEB = false; - //this call is to ensure that validator 302913 has proven their withdrawalcreds - // ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/goerli_slot_6397952.json" "data/goerli_block_header_6397852.json" "data/goerli_block_6397852.json" "fullWithdrawalProof_CapellaAgainstDeneb.json" false true - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod newPod = eigenPodManager.getPod(podOwner); + // function testFullWithdrawalFlowDeneb() public returns (IEigenPod) { + // eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP_GOERLI); + // IS_DENEB = true; + // //this call is to ensure that validator 302913 has proven their withdrawalcreds + // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); + + // //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false false + // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json + // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json + // setJSON("./src/test/test-data/fullWithdrawalDeneb.json"); + // return _proveWithdrawalForPod(newPod); + // } - //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false - // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - setJSON("./src/test/test-data/fullWithdrawalCapellaAgainstDenebRoot.json"); - return _proveWithdrawalForPod(newPod); - } + // function testFullWithdrawalFlowCapellaWithdrawalAgainstDenebRoot() public returns (IEigenPod) { + // IS_DENEB = false; + // //this call is to ensure that validator 302913 has proven their withdrawalcreds + // // ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/goerli_slot_6397952.json" "data/goerli_block_header_6397852.json" "data/goerli_block_6397852.json" "fullWithdrawalProof_CapellaAgainstDeneb.json" false true + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); + + // //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false + // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json + // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json + // setJSON("./src/test/test-data/fullWithdrawalCapellaAgainstDenebRoot.json"); + // return _proveWithdrawalForPod(newPod); + // } - function testFullWithdrawalFlow() public returns (IEigenPod) { - //this call is to ensure that validator 302913 has proven their withdrawalcreds - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod newPod = eigenPodManager.getPod(podOwner); + // function testFullWithdrawalFlow() public returns (IEigenPod) { + // //this call is to ensure that validator 302913 has proven their withdrawalcreds + // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); - //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - return _proveWithdrawalForPod(newPod); - } + // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false + // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json + // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // return _proveWithdrawalForPod(newPod); + // } /** * @notice this test is to ensure that a full withdrawal can be made once a validator has processed their first full withrawal * This is specifically for the case where a validator has redeposited into their exited validator and needs to prove another withdrawal * to get their funds out */ - function testWithdrawAfterFullWithdrawal() external { - _deployInternalFunctionTester(); - IEigenPod pod = testFullWithdrawalFlow(); + // function testWithdrawAfterFullWithdrawal() external { + // _deployInternalFunctionTester(); + // IEigenPod pod = testFullWithdrawalFlow(); - // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest_1SlotAdvanced.json" true - setJSON("./src/test/test-data/fullWithdrawalProof_Latest_1SlotAdvanced.json"); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); + // // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest_1SlotAdvanced.json" true + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest_1SlotAdvanced.json"); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - withdrawalFields = getWithdrawalFields(); - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - uint64 leftOverBalanceWEI = uint64( - withdrawalAmountGwei - pod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() - ) * uint64(GWEI_TO_WEI); - cheats.deal(address(pod), leftOverBalanceWEI); - { - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - 1 - ); - withdrawalProofsArray[0] = _getWithdrawalProof(); - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - pod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - } - } - - function testProvingFullWithdrawalForTheSameSlotFails() external { - IEigenPod pod = testFullWithdrawalFlow(); + // withdrawalFields = getWithdrawalFields(); + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // uint64 leftOverBalanceWEI = uint64( + // withdrawalAmountGwei - pod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() + // ) * uint64(GWEI_TO_WEI); + // cheats.deal(address(pod), leftOverBalanceWEI); + // { + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( + // 1 + // ); + // withdrawalProofsArray[0] = _getWithdrawalProof(); + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; + + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + + // pod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // } + // } - { - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - 1 - ); - withdrawalProofsArray[0] = _getWithdrawalProof(); - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - cheats.expectRevert( - bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - ); - pod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - } - } + // function testProvingFullWithdrawalForTheSameSlotFails() external { + // IEigenPod pod = testFullWithdrawalFlow(); + + // { + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( + // 1 + // ); + // withdrawalProofsArray[0] = _getWithdrawalProof(); + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; + + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + + // cheats.expectRevert( + // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") + // ); + // pod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // } + // } /// @notice This test is to ensure that the partial withdrawal flow works correctly - function testPartialWithdrawalFlow() public returns (IEigenPod) { - //this call is to ensure that validator 61068 has proven their withdrawalcreds - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - //generate partialWithdrawalProofs.json with: - // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "partialWithdrawalProof_Latest.json" false - setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - withdrawalFields = getWithdrawalFields(); - validatorFields = getValidatorFields(); - BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); + // function testPartialWithdrawalFlow() public returns (IEigenPod) { + // //this call is to ensure that validator 61068 has proven their withdrawalcreds + // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); + + // //generate partialWithdrawalProofs.json with: + // // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "partialWithdrawalProof_Latest.json" false + // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); + // withdrawalFields = getWithdrawalFields(); + // validatorFields = getValidatorFields(); + // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); + // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - uint40 validatorIndex = uint40( - Endian.fromLittleEndianUint64(withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX]) - ); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // uint40 validatorIndex = uint40( + // Endian.fromLittleEndianUint64(withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX]) + // ); - cheats.deal(address(newPod), stakeAmount); - { - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - 1 - ); - withdrawalProofsArray[0] = withdrawalProofs; - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = validatorFieldsProof; - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = validatorFields; - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; - - uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - //cheats.expectEmit(true, true, true, true, address(newPod)); - // cheats.expectEmit(validatorIndex, _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), podOwner, withdrawalAmountGwei, address(newPod)); - emit PartialWithdrawalRedeemed( - validatorIndex, - _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), - podOwner, - withdrawalAmountGwei - ); - newPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - require( - newPod.provenWithdrawal( - validatorFields[0], - _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)) - ), - "provenPartialWithdrawal should be true" - ); - withdrawalAmountGwei = uint64(withdrawalAmountGwei * GWEI_TO_WEI); - require( - address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == - withdrawalAmountGwei, - "pod delayed withdrawal balance hasn't been updated correctly" - ); - } + // cheats.deal(address(newPod), stakeAmount); + // { + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( + // 1 + // ); + // withdrawalProofsArray[0] = withdrawalProofs; + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = validatorFieldsProof; + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = validatorFields; + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; + + // uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; + + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + + // //cheats.expectEmit(true, true, true, true, address(newPod)); + // // cheats.expectEmit(validatorIndex, _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), podOwner, withdrawalAmountGwei, address(newPod)); + // emit PartialWithdrawalRedeemed( + // validatorIndex, + // _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), + // podOwner, + // withdrawalAmountGwei + // ); + // newPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // require( + // newPod.provenWithdrawal( + // validatorFields[0], + // _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)) + // ), + // "provenPartialWithdrawal should be true" + // ); + // withdrawalAmountGwei = uint64(withdrawalAmountGwei * GWEI_TO_WEI); + // require( + // address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == + // withdrawalAmountGwei, + // "pod delayed withdrawal balance hasn't been updated correctly" + // ); + // } - cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); - uint256 podOwnerBalanceBefore = address(podOwner).balance; - delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); - require( - address(podOwner).balance - podOwnerBalanceBefore == withdrawalAmountGwei, - "Pod owner balance hasn't been updated correctly" - ); - return newPod; - } + // cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); + // uint256 podOwnerBalanceBefore = address(podOwner).balance; + // delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); + // require( + // address(podOwner).balance - podOwnerBalanceBefore == withdrawalAmountGwei, + // "Pod owner balance hasn't been updated correctly" + // ); + // return newPod; + // } /// @notice verifies that multiple partial withdrawals can be made before a full withdrawal - function testProvingMultiplePartialWithdrawalsForSameSlot() public /*uint256 numPartialWithdrawals*/ { - IEigenPod newPod = testPartialWithdrawalFlow(); + // function testProvingMultiplePartialWithdrawalsForSameSlot() public /*uint256 numPartialWithdrawals*/ { + // IEigenPod newPod = testPartialWithdrawalFlow(); - BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - withdrawalFields = getWithdrawalFields(); - validatorFields = getValidatorFields(); + // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); + // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); + // withdrawalFields = getWithdrawalFields(); + // validatorFields = getValidatorFields(); - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); - withdrawalProofsArray[0] = withdrawalProofs; - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = validatorFieldsProof; - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = validatorFields; - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); + // withdrawalProofsArray[0] = withdrawalProofs; + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = validatorFieldsProof; + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = validatorFields; + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - cheats.expectRevert( - bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - ); - newPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - } + // cheats.expectRevert( + // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") + // ); + // newPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // } /// @notice verifies that multiple full withdrawals for a single validator fail - function testDoubleFullWithdrawal() public returns (IEigenPod newPod) { - newPod = testFullWithdrawalFlow(); - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * - uint64(GWEI_TO_WEI); - cheats.deal(address(newPod), leftOverBalanceWEI); + // function testDoubleFullWithdrawal() public returns (IEigenPod newPod) { + // newPod = testFullWithdrawalFlow(); + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * + // uint64(GWEI_TO_WEI); + // cheats.deal(address(newPod), leftOverBalanceWEI); - BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - withdrawalFields = getWithdrawalFields(); - validatorFields = getValidatorFields(); + // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); + // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); + // withdrawalFields = getWithdrawalFields(); + // validatorFields = getValidatorFields(); - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); - withdrawalProofsArray[0] = withdrawalProofs; - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = validatorFieldsProof; - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = validatorFields; - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); + // withdrawalProofsArray[0] = withdrawalProofs; + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = validatorFieldsProof; + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = validatorFields; + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - cheats.expectRevert( - bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - ); - newPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); + // cheats.expectRevert( + // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") + // ); + // newPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); - return newPod; - } + // return newPod; + // } function testDeployAndVerifyNewEigenPod() public returns (IEigenPod) { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" @@ -895,28 +894,35 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); } - // test freezing operator after a beacon chain slashing event - function testUpdateSlashedBeaconBalance() public { - _deployInternalFunctionTester(); - //make initial deposit - // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod newPod = eigenPodManager.getPod(podOwner); + // // test freezing operator after a beacon chain slashing event + // function testUpdateSlashedBeaconBalance() public { + // _deployInternalFunctionTester(); + // //make initial deposit + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); +<<<<<<< HEAD cheats.warp(block.timestamp + 1); // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); _proveOverCommittedStake(newPod); - - uint64 newValidatorBalance = _getValidatorUpdatedBalance(); - int256 beaconChainETHShares = eigenPodManager.podOwnerShares(podOwner); - - require( - beaconChainETHShares == int256((newValidatorBalance) * GWEI_TO_WEI), - "eigenPodManager shares not updated correctly" - ); - } +======= + // cheats.warp(GOERLI_GENESIS_TIME); + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // _proveOverCommittedStake(newPod); +>>>>>>> a524406e (feat: poc for partial withdrawal batching) + + // uint64 newValidatorBalance = _getValidatorUpdatedBalance(); + // int256 beaconChainETHShares = eigenPodManager.podOwnerShares(podOwner); + + // require( + // beaconChainETHShares == int256((newValidatorBalance) * GWEI_TO_WEI), + // "eigenPodManager shares not updated correctly" + // ); + // } /// @notice Similar test done in EP unit test //test deploying an eigen pod with mismatched withdrawal credentials between the proof and the actual pod's address @@ -969,18 +975,18 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { } //ensures that a validator proving WC after they have exited the beacon chain is allowed to //prove their WC and process a withdrawal - function testProveWithdrawalCredentialsAfterValidatorExit() public { - // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); - emit log("hello"); - - IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _proveWithdrawalForPod(newPod); - } + // function testProveWithdrawalCredentialsAfterValidatorExit() public { + // // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); + // emit log("hello"); + + // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false + // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json + // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _proveWithdrawalForPod(newPod); + // } function testVerifyWithdrawalCredsFromNonPodOwnerAddress(address nonPodOwnerAddress) public { // nonPodOwnerAddress must be different from podOwner @@ -1020,36 +1026,36 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - function testBalanceProofWithWrongTimestamp(uint64 timestamp) public { - cheats.assume(timestamp > GOERLI_GENESIS_TIME); - // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - IEigenPod newPod = testDeployAndVerifyNewEigenPod(); + // function testBalanceProofWithWrongTimestamp(uint64 timestamp) public { + // cheats.assume(timestamp > GOERLI_GENESIS_TIME); + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // IEigenPod newPod = testDeployAndVerifyNewEigenPod(); - // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // prove overcommitted balance - cheats.warp(timestamp); - _proveOverCommittedStake(newPod); + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // // prove overcommitted balance + // cheats.warp(timestamp); + // _proveOverCommittedStake(newPod); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - bytes memory proof = abi.encodePacked(getBalanceUpdateProof()); - bytes[] memory proofs = new bytes[](1); - proofs[0] = proof; + // bytes memory proof = abi.encodePacked(getBalanceUpdateProof()); + // bytes[] memory proofs = new bytes[](1); + // proofs[0] = proof; - bytes32 newLatestBlockRoot = getLatestBlockRoot(); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // bytes32 newLatestBlockRoot = getLatestBlockRoot(); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp")); - newPod.verifyBalanceUpdates(uint64(block.timestamp - 1), validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); - } + // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp")); + // newPod.verifyBalanceUpdates(uint64(block.timestamp - 1), validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); + // } // // 3. Single withdrawal credential // // Test: Owner proves an withdrawal credential. @@ -1072,91 +1078,107 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // Test: Watcher proves an overcommitted balance for validator from (3). // validator status should be marked as OVERCOMMITTED - function testProveOverCommittedBalance() public { - _deployInternalFunctionTester(); - // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // get beaconChainETH shares - int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); + // function testProveOverCommittedBalance() public { + // _deployInternalFunctionTester(); + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // // get beaconChainETH shares + // int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); - bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - uint256 validatorRestakedBalanceBefore = newPod - .validatorPubkeyHashToInfo(validatorPubkeyHash) - .restakedBalanceGwei; + // bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); + // uint256 validatorRestakedBalanceBefore = newPod + // .validatorPubkeyHashToInfo(validatorPubkeyHash) + // .restakedBalanceGwei; +<<<<<<< HEAD // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); // prove overcommitted balance cheats.warp(block.timestamp + 1); _proveOverCommittedStake(newPod); +======= + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // // prove overcommitted balance + // cheats.warp(GOERLI_GENESIS_TIME); + // _proveOverCommittedStake(newPod); +>>>>>>> a524406e (feat: poc for partial withdrawal batching) + + // uint256 validatorRestakedBalanceAfter = newPod + // .validatorPubkeyHashToInfo(validatorPubkeyHash) + // .restakedBalanceGwei; + + // uint64 newValidatorBalance = _getValidatorUpdatedBalance(); + // int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); + // assertTrue( + // eigenPodManager.podOwnerShares(podOwner) == + // int256(newValidatorBalance * GWEI_TO_WEI), + // "hysterisis not working" + // ); + // assertTrue( + // beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, + // "BeaconChainETHShares not updated" + // ); + // assertTrue( + // int256(validatorRestakedBalanceBefore) - int256(validatorRestakedBalanceAfter) == + // shareDiff / int256(GWEI_TO_WEI), + // "validator restaked balance not updated" + // ); + // } - uint256 validatorRestakedBalanceAfter = newPod - .validatorPubkeyHashToInfo(validatorPubkeyHash) - .restakedBalanceGwei; - - uint64 newValidatorBalance = _getValidatorUpdatedBalance(); - int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); - assertTrue( - eigenPodManager.podOwnerShares(podOwner) == - int256(newValidatorBalance * GWEI_TO_WEI), - "hysterisis not working" - ); - assertTrue( - beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, - "BeaconChainETHShares not updated" - ); - assertTrue( - int256(validatorRestakedBalanceBefore) - int256(validatorRestakedBalanceAfter) == - shareDiff / int256(GWEI_TO_WEI), - "validator restaked balance not updated" - ); - } - - function testVerifyUndercommittedBalance() public { - _deployInternalFunctionTester(); - // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // get beaconChainETH shares - int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); - bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - uint256 validatorRestakedBalanceBefore = newPod - .validatorPubkeyHashToInfo(validatorPubkeyHash) - .restakedBalanceGwei; - + // function testVerifyUndercommittedBalance() public { + // _deployInternalFunctionTester(); + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // // get beaconChainETH shares + // int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); + // bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); + // uint256 validatorRestakedBalanceBefore = newPod + // .validatorPubkeyHashToInfo(validatorPubkeyHash) + // .restakedBalanceGwei; + +<<<<<<< HEAD // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); // prove overcommitted balance cheats.warp(block.timestamp + 1); _proveOverCommittedStake(newPod); - - cheats.warp(block.timestamp + 1); - // ./solidityProofGen "BalanceUpdateProof" 302913 false 100 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json"); - _proveUnderCommittedStake(newPod); - - uint256 validatorRestakedBalanceAfter = newPod - .validatorPubkeyHashToInfo(validatorPubkeyHash) - .restakedBalanceGwei; - - int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); - - assertTrue( - eigenPodManager.podOwnerShares(podOwner) == - int256((MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * GWEI_TO_WEI), - "hysterisis not working" - ); - assertTrue( - beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, - "BeaconChainETHShares not updated" - ); - assertTrue( - int256(uint256(validatorRestakedBalanceBefore)) - int256(uint256(validatorRestakedBalanceAfter)) == - shareDiff / int256(GWEI_TO_WEI), - "validator restaked balance not updated" - ); - } +======= + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // // prove overcommitted balance + // cheats.warp(GOERLI_GENESIS_TIME); + // _proveOverCommittedStake(newPod); +>>>>>>> a524406e (feat: poc for partial withdrawal batching) + + // cheats.warp(block.timestamp + 1); + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 100 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json"); + // _proveUnderCommittedStake(newPod); + + // uint256 validatorRestakedBalanceAfter = newPod + // .validatorPubkeyHashToInfo(validatorPubkeyHash) + // .restakedBalanceGwei; + + // int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); + + // assertTrue( + // eigenPodManager.podOwnerShares(podOwner) == + // int256((MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * GWEI_TO_WEI), + // "hysterisis not working" + // ); + // assertTrue( + // beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, + // "BeaconChainETHShares not updated" + // ); + // assertTrue( + // int256(uint256(validatorRestakedBalanceBefore)) - int256(uint256(validatorRestakedBalanceAfter)) == + // shareDiff / int256(GWEI_TO_WEI), + // "validator restaked balance not updated" + // ); + // } function testDeployingEigenPodRevertsWhenPaused() external { // pause the contract @@ -1286,80 +1308,80 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - function testVerifyOvercommittedStakeRevertsWhenPaused() external { - // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + // function testVerifyOvercommittedStakeRevertsWhenPaused() external { + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - bytes[] memory proofs = new bytes[](1); - proofs[0] = abi.encodePacked(getBalanceUpdateProof()); + // bytes[] memory proofs = new bytes[](1); + // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - bytes32 newBeaconStateRoot = getBeaconStateRoot(); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newBeaconStateRoot); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // bytes32 newBeaconStateRoot = getBeaconStateRoot(); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newBeaconStateRoot); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // pause the contract - cheats.startPrank(pauser); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); - cheats.stopPrank(); + // // pause the contract + // cheats.startPrank(pauser); + // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); + // cheats.stopPrank(); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - newPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); - } + // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); + // newPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); + // } - function _proveOverCommittedStake(IEigenPod newPod) internal { - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + // function _proveOverCommittedStake(IEigenPod newPod) internal { + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - bytes[] memory proofs = new bytes[](1); - proofs[0] = abi.encodePacked(getBalanceUpdateProof()); + // bytes[] memory proofs = new bytes[](1); + // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - bytes32 newLatestBlockRoot = getLatestBlockRoot(); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - newPod.verifyBalanceUpdates( - uint64(block.timestamp), - validatorIndices, - stateRootProofStruct, - proofs, - validatorFieldsArray - ); - } + // bytes32 newLatestBlockRoot = getLatestBlockRoot(); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // newPod.verifyBalanceUpdates( + // uint64(block.timestamp), + // validatorIndices, + // stateRootProofStruct, + // proofs, + // validatorFieldsArray + // ); + // } - function _proveUnderCommittedStake(IEigenPod newPod) internal { - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + // function _proveUnderCommittedStake(IEigenPod newPod) internal { + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - bytes[] memory proofs = new bytes[](1); - proofs[0] = abi.encodePacked(getBalanceUpdateProof()); + // bytes[] memory proofs = new bytes[](1); + // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - bytes32 newLatestBlockRoot = getLatestBlockRoot(); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // bytes32 newLatestBlockRoot = getLatestBlockRoot(); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - newPod.verifyBalanceUpdates( - uint64(block.timestamp), - validatorIndices, - stateRootProofStruct, - proofs, - validatorFieldsArray - ); - require(newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).status == IEigenPod.VALIDATOR_STATUS.ACTIVE); - } + // newPod.verifyBalanceUpdates( + // uint64(block.timestamp), + // validatorIndices, + // stateRootProofStruct, + // proofs, + // validatorFieldsArray + // ); + // require(newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).status == IEigenPod.VALIDATOR_STATUS.ACTIVE); + // } function _getValidatorUpdatedBalance() internal returns (uint64) { bytes32[] memory validatorFieldsToGet = getValidatorFields(); @@ -1507,70 +1529,70 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ); } - function _proveWithdrawalForPod(IEigenPod newPod) internal returns (IEigenPod) { - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - uint64 restakedExecutionLayerGweiBefore = newPod.withdrawableRestakedExecutionLayerGwei(); + // function _proveWithdrawalForPod(IEigenPod newPod) internal returns (IEigenPod) { + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); + // uint64 restakedExecutionLayerGweiBefore = newPod.withdrawableRestakedExecutionLayerGwei(); - withdrawalFields = getWithdrawalFields(); - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); - uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * - uint64(GWEI_TO_WEI); - cheats.deal(address(newPod), leftOverBalanceWEI); - emit log_named_uint("leftOverBalanceWEI", leftOverBalanceWEI); - emit log_named_uint("address(newPod)", address(newPod).balance); - emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); - - uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; - { - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - 1 - ); - withdrawalProofsArray[0] = _getWithdrawalProof(); - bytes[] memory validatorFieldsProofArray = new bytes[](1); - validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - withdrawalFieldsArray[0] = withdrawalFields; - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - newPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - } - require( - newPod.withdrawableRestakedExecutionLayerGwei() - restakedExecutionLayerGweiBefore == - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(), - "restakedExecutionLayerGwei has not been incremented correctly" - ); - require( - address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == - leftOverBalanceWEI, - "pod delayed withdrawal balance hasn't been updated correctly" - ); - require( - newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).restakedBalanceGwei == 0, - "balance not reset correctly" - ); + // withdrawalFields = getWithdrawalFields(); + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); + // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * + // uint64(GWEI_TO_WEI); + // cheats.deal(address(newPod), leftOverBalanceWEI); + // emit log_named_uint("leftOverBalanceWEI", leftOverBalanceWEI); + // emit log_named_uint("address(newPod)", address(newPod).balance); + // emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); + + // uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; + // { + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( + // 1 + // ); + // withdrawalProofsArray[0] = _getWithdrawalProof(); + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + // withdrawalFieldsArray[0] = withdrawalFields; + + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + + // newPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // } + // require( + // newPod.withdrawableRestakedExecutionLayerGwei() - restakedExecutionLayerGweiBefore == + // newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(), + // "restakedExecutionLayerGwei has not been incremented correctly" + // ); + // require( + // address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == + // leftOverBalanceWEI, + // "pod delayed withdrawal balance hasn't been updated correctly" + // ); + // require( + // newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).restakedBalanceGwei == 0, + // "balance not reset correctly" + // ); - cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); - uint256 podOwnerBalanceBefore = address(podOwner).balance; - delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); - require( - address(podOwner).balance - podOwnerBalanceBefore == leftOverBalanceWEI, - "Pod owner balance hasn't been updated correctly" - ); - return newPod; - } + // cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); + // uint256 podOwnerBalanceBefore = address(podOwner).balance; + // delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); + // require( + // address(podOwner).balance - podOwnerBalanceBefore == leftOverBalanceWEI, + // "Pod owner balance hasn't been updated correctly" + // ); + // return newPod; + // } // simply tries to register 'sender' as a delegate, setting their 'DelegationTerms' contract in DelegationManager to 'dt' // verifies that the storage of DelegationManager contract is updated appropriately @@ -1783,44 +1805,44 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), abi.encodePacked(getStateRootProof())); } - /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - IEigenPod newPod = eigenPodManager.getPod(podOwner); + // /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow + // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { + // IEigenPod newPod = eigenPodManager.getPod(podOwner); - //make initial deposit - cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); + // //make initial deposit + // cheats.startPrank(podOwner); + // cheats.expectEmit(true, true, true, true, address(newPod)); + // emit EigenPodStaked(pubkey); + // eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + // cheats.stopPrank(); - if(!IS_DENEB){ - emit log("NOT DENEB"); - } - bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); - bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); - { - bytes32 blockRoot = getBlockRoot(); - bytes32 slotRoot = getSlotRoot(); - bytes32 timestampRoot = getTimestampRoot(); - bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - return - BeaconChainProofs.WithdrawalProof( - abi.encodePacked(withdrawalProof), - abi.encodePacked(getSlotProof()), - abi.encodePacked(getExecutionPayloadProof()), - abi.encodePacked(timestampProof), - abi.encodePacked(getHistoricalSummaryProof()), - uint64(getBlockRootIndex()), - uint64(getHistoricalSummaryIndex()), - uint64(getWithdrawalIndex()), - blockRoot, - slotRoot, - timestampRoot, - executionPayloadRoot - ); - } - } + // if(!IS_DENEB){ + // emit log("NOT DENEB"); + // } + // bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); + // bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); + // { + // bytes32 blockRoot = getBlockRoot(); + // bytes32 slotRoot = getSlotRoot(); + // bytes32 timestampRoot = getTimestampRoot(); + // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); + // return + // BeaconChainProofs.WithdrawalProof( + // abi.encodePacked(withdrawalProof), + // abi.encodePacked(getSlotProof()), + // abi.encodePacked(getExecutionPayloadProof()), + // abi.encodePacked(timestampProof), + // abi.encodePacked(getHistoricalSummaryProof()), + // uint64(getBlockRootIndex()), + // uint64(getHistoricalSummaryIndex()), + // uint64(getWithdrawalIndex()), + // blockRoot, + // slotRoot, + // timestampRoot, + // executionPayloadRoot + // ); + // } + // } function _setOracleBlockRoot() internal { @@ -1838,21 +1860,20 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ethPOSDeposit, delayedWithdrawalRouter, IEigenPodManager(podManagerAddress), - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); } } -contract Relayer is Test { - function verifyWithdrawal( - bytes32 beaconStateRoot, - bytes32[] calldata withdrawalFields, - BeaconChainProofs.WithdrawalProof calldata proofs - ) public view { - BeaconChainProofs.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs, type(uint64).max); - } -} +// contract Relayer is Test { +// function verifyWithdrawal( +// bytes32 beaconStateRoot, +// bytes32[] calldata withdrawalFields, +// BeaconChainProofs.WithdrawalProof calldata proofs +// ) public view { +// BeaconChainProofs.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs, type(uint64).max); +// } +// } //TODO: Integration Tests from old EPM unit tests: diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 50582dfe7..92746ddd2 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -10,13 +10,11 @@ contract EPInternalFunctions is EigenPod, Test { IETHPOSDeposit _ethPOS, IDelayedWithdrawalRouter _delayedWithdrawalRouter, IEigenPodManager _eigenPodManager, - uint64 _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, uint64 _GENESIS_TIME ) EigenPod( _ethPOS, _delayedWithdrawalRouter, _eigenPodManager, - _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME ) {} @@ -44,75 +42,6 @@ contract EPInternalFunctions is EigenPod, Test { ); } - function verifyAndProcessWithdrawal( - bytes32 beaconStateRoot, - BeaconChainProofs.WithdrawalProof calldata withdrawalProof, - bytes calldata validatorFieldsProof, - bytes32[] calldata validatorFields, - bytes32[] calldata withdrawalFields - ) public returns (IEigenPod.VerifiedWithdrawal memory) { - return _verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalProof, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - } - - function processFullWithdrawal( - uint40 validatorIndex, - bytes32 validatorPubkeyHash, - uint64 withdrawalHappenedTimestamp, - address recipient, - uint64 withdrawalAmountGwei, - ValidatorInfo memory validatorInfo - ) public returns(IEigenPod.VerifiedWithdrawal memory) { - return _processFullWithdrawal( - validatorIndex, - validatorPubkeyHash, - withdrawalHappenedTimestamp, - recipient, - withdrawalAmountGwei, - validatorInfo - ); - } - - function processPartialWithdrawal( - uint40 validatorIndex, - uint64 withdrawalHappenedTimestamp, - address recipient, - uint64 withdrawalAmountGwei - ) public returns(IEigenPod.VerifiedWithdrawal memory) { - return _processPartialWithdrawal( - validatorIndex, - withdrawalHappenedTimestamp, - recipient, - withdrawalAmountGwei - ); - } - - function verifyBalanceUpdate( - uint64 oracleTimestamp, - uint40 validatorIndex, - bytes32 beaconStateRoot, - bytes calldata validatorFieldsProofs, - bytes32[] calldata validatorFields, - uint64 mostRecentBalanceUpdateTimestamp - ) - public returns (int256) - { - bytes32 pkhash = validatorFields[0]; - _validatorPubkeyHashToInfo[pkhash].mostRecentBalanceUpdateTimestamp = mostRecentBalanceUpdateTimestamp; - return _verifyBalanceUpdate( - oracleTimestamp, - validatorIndex, - beaconStateRoot, - validatorFieldsProofs, - validatorFields - ); - } - function setValidatorStatus(bytes32 pkhash, VALIDATOR_STATUS status) public { _validatorPubkeyHashToInfo[pkhash].status = status; } diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 3849e92f6..74e76e80d 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -252,7 +252,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, 0 ); @@ -319,7 +318,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - address(beaconChainOracle), eigenLayerReputedMultisig, // initialOwner eigenLayerPauserReg, 0 // initialPausedStatus @@ -387,7 +385,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, 0 ); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); @@ -465,7 +462,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - eigenPodManager.updateBeaconChainOracle(beaconChainOracle); timeMachine.setProofGenStartTime(0); beaconChain.setNextTimestamp(timeMachine.proofGenStartTime()); @@ -497,7 +493,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, 0 ); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); @@ -575,7 +570,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - eigenPodManager.updateBeaconChainOracle(beaconChainOracle); timeMachine.setProofGenStartTime(0); beaconChain.setNextTimestamp(timeMachine.proofGenStartTime()); @@ -720,7 +714,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { 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 @@ -731,7 +724,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { cheats.startPrank(executorMultisig); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - eigenPodManager.updateBeaconChainOracle(beaconChainOracle); cheats.stopPrank(); } else { diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index ec5619850..c92dc5feb 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -18,22 +18,22 @@ struct CredentialsProofs { bytes32[][] validatorFields; } -struct BeaconWithdrawal { - uint64 oracleTimestamp; - BeaconChainProofs.StateRootProof stateRootProof; - BeaconChainProofs.WithdrawalProof[] withdrawalProofs; - bytes[] validatorFieldsProofs; - bytes32[][] validatorFields; - bytes32[][] withdrawalFields; -} - -struct BalanceUpdate { - uint64 oracleTimestamp; - BeaconChainProofs.StateRootProof stateRootProof; - uint40[] validatorIndices; - bytes[] validatorFieldsProofs; - bytes32[][] validatorFields; -} +// struct BeaconWithdrawal { +// uint64 oracleTimestamp; +// BeaconChainProofs.StateRootProof stateRootProof; +// BeaconChainProofs.WithdrawalProof[] withdrawalProofs; +// bytes[] validatorFieldsProofs; +// bytes32[][] validatorFields; +// bytes32[][] withdrawalFields; +// } + +// struct BalanceUpdate { +// uint64 oracleTimestamp; +// BeaconChainProofs.StateRootProof stateRootProof; +// uint40[] validatorIndices; +// bytes[] validatorFieldsProofs; +// bytes32[][] validatorFields; +// } contract BeaconChainMock is Test { @@ -116,49 +116,49 @@ contract BeaconChainMock is Test { * Additionally, it will send the withdrawal amount to the validator's withdrawal * destination. */ - function exitValidator(uint40 validatorIndex) public returns (BeaconWithdrawal memory) { - emit log_named_uint("- BeaconChain.exitValidator: ", validatorIndex); + // function exitValidator(uint40 validatorIndex) public returns (BeaconWithdrawal memory) { + // emit log_named_uint("- BeaconChain.exitValidator: ", validatorIndex); - Validator memory validator = validators[validatorIndex]; + // Validator memory validator = validators[validatorIndex]; - // Get the withdrawal amount and destination - uint amountToWithdraw = validator.effectiveBalanceGwei * GWEI_TO_WEI; - address destination = _toAddress(validator.withdrawalCreds); + // // Get the withdrawal amount and destination + // uint amountToWithdraw = validator.effectiveBalanceGwei * GWEI_TO_WEI; + // address destination = _toAddress(validator.withdrawalCreds); - // Generate exit proofs for a full exit - BeaconWithdrawal memory withdrawal = _genExitProof(validator); + // // Generate exit proofs for a full exit + // BeaconWithdrawal memory withdrawal = _genExitProof(validator); - // Update state - set validator balance to zero and send balance to withdrawal destination - validators[validatorIndex].effectiveBalanceGwei = 0; - cheats.deal(destination, destination.balance + amountToWithdraw); + // // Update state - set validator balance to zero and send balance to withdrawal destination + // validators[validatorIndex].effectiveBalanceGwei = 0; + // cheats.deal(destination, destination.balance + amountToWithdraw); - return withdrawal; - } + // return withdrawal; + // } /** * Note: `delta` is expected to be a raw token amount. This method will convert the delta to Gwei */ - function updateBalance(uint40 validatorIndex, int delta) public returns (BalanceUpdate memory) { - delta /= int(GWEI_TO_WEI); + // function updateBalance(uint40 validatorIndex, int delta) public returns (BalanceUpdate memory) { + // delta /= int(GWEI_TO_WEI); - emit log_named_uint("- BeaconChain.updateBalance for validator: ", validatorIndex); - emit log_named_int("- BeaconChain.updateBalance delta gwei: ", delta); + // emit log_named_uint("- BeaconChain.updateBalance for validator: ", validatorIndex); + // emit log_named_int("- BeaconChain.updateBalance delta gwei: ", delta); - // Apply delta and update validator balance in state - uint64 newBalance; - if (delta <= 0) { - newBalance = validators[validatorIndex].effectiveBalanceGwei - uint64(uint(-delta)); - } else { - newBalance = validators[validatorIndex].effectiveBalanceGwei + uint64(uint(delta)); - } - validators[validatorIndex].effectiveBalanceGwei = newBalance; + // // Apply delta and update validator balance in state + // uint64 newBalance; + // if (delta <= 0) { + // newBalance = validators[validatorIndex].effectiveBalanceGwei - uint64(uint(-delta)); + // } else { + // newBalance = validators[validatorIndex].effectiveBalanceGwei + uint64(uint(delta)); + // } + // validators[validatorIndex].effectiveBalanceGwei = newBalance; - // Generate balance update proof - Validator memory validator = validators[validatorIndex]; - BalanceUpdate memory update = _genBalanceUpdateProof(validator); + // // Generate balance update proof + // Validator memory validator = validators[validatorIndex]; + // BalanceUpdate memory update = _genBalanceUpdateProof(validator); - return update; - } + // return update; + // } function setNextTimestamp(uint64 timestamp) public { nextTimestamp = timestamp; @@ -259,145 +259,145 @@ contract BeaconChainMock is Test { * roots are calculated and the final beaconBlockRoot can be calculated and sent to the * oracle. */ - function _genExitProof(Validator memory validator) internal returns (BeaconWithdrawal memory) { - BeaconWithdrawal memory withdrawal; - uint64 withdrawalEpoch = uint64(block.timestamp); - - // Get a new, unique timestamp for queries to the oracle - withdrawal.oracleTimestamp = uint64(nextTimestamp); - nextTimestamp++; - - // Initialize proof arrays - BeaconChainProofs.WithdrawalProof memory withdrawalProof = _initWithdrawalProof({ - withdrawalEpoch: withdrawalEpoch, - withdrawalIndex: WITHDRAWAL_INDEX, - oracleTimestamp: withdrawal.oracleTimestamp - }); - - // Calculate withdrawalFields and record the validator's index and withdrawal amount - withdrawal.withdrawalFields = new bytes32[][](1); - withdrawal.withdrawalFields[0] = new bytes32[](2 ** BeaconChainProofs.WITHDRAWAL_FIELD_TREE_HEIGHT); - withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX] = - _toLittleEndianUint64(validator.validatorIndex); - withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] = - _toLittleEndianUint64(validator.effectiveBalanceGwei); - - { - /** - * Generate proofs then root for subtree: - * - * executionPayloadRoot - * - timestampRoot (withdrawalProof.timestampProof) - * - withdrawalFieldsRoot (withdrawalProof.withdrawalProof) - */ - withdrawalProof.executionPayloadRoot = _genExecPayloadProofs({ - withdrawalProof: withdrawalProof, - withdrawalRoot: Merkle.merkleizeSha256(withdrawal.withdrawalFields[0]) - }); - } - - { - /** - * Generate proofs then root for subtree: - * - * blockRoot (historical summaries) - * - slotRoot (withdrawalProof.slotProof) - * - executionPayloadRoot (withdrawalProof.executionPayloadProof) - */ - withdrawalProof.blockRoot = _genBlockRootProofs({ - withdrawalProof: withdrawalProof - }); - } - - // validatorFields - withdrawal.validatorFields = new bytes32[][](1); - withdrawal.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); - withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; - withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWABLE_EPOCH_INDEX] = - _toLittleEndianUint64(withdrawalEpoch); + // function _genExitProof(Validator memory validator) internal returns (BeaconWithdrawal memory) { + // BeaconWithdrawal memory withdrawal; + // uint64 withdrawalEpoch = uint64(block.timestamp); + + // // Get a new, unique timestamp for queries to the oracle + // withdrawal.oracleTimestamp = uint64(nextTimestamp); + // nextTimestamp++; + + // // Initialize proof arrays + // BeaconChainProofs.WithdrawalProof memory withdrawalProof = _initWithdrawalProof({ + // withdrawalEpoch: withdrawalEpoch, + // withdrawalIndex: WITHDRAWAL_INDEX, + // oracleTimestamp: withdrawal.oracleTimestamp + // }); + + // // Calculate withdrawalFields and record the validator's index and withdrawal amount + // withdrawal.withdrawalFields = new bytes32[][](1); + // withdrawal.withdrawalFields[0] = new bytes32[](2 ** BeaconChainProofs.WITHDRAWAL_FIELD_TREE_HEIGHT); + // withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX] = + // _toLittleEndianUint64(validator.validatorIndex); + // withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] = + // _toLittleEndianUint64(validator.effectiveBalanceGwei); + + // { + // /** + // * Generate proofs then root for subtree: + // * + // * executionPayloadRoot + // * - timestampRoot (withdrawalProof.timestampProof) + // * - withdrawalFieldsRoot (withdrawalProof.withdrawalProof) + // */ + // withdrawalProof.executionPayloadRoot = _genExecPayloadProofs({ + // withdrawalProof: withdrawalProof, + // withdrawalRoot: Merkle.merkleizeSha256(withdrawal.withdrawalFields[0]) + // }); + // } + + // { + // /** + // * Generate proofs then root for subtree: + // * + // * blockRoot (historical summaries) + // * - slotRoot (withdrawalProof.slotProof) + // * - executionPayloadRoot (withdrawalProof.executionPayloadProof) + // */ + // withdrawalProof.blockRoot = _genBlockRootProofs({ + // withdrawalProof: withdrawalProof + // }); + // } + + // // validatorFields + // withdrawal.validatorFields = new bytes32[][](1); + // withdrawal.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); + // withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; + // withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWABLE_EPOCH_INDEX] = + // _toLittleEndianUint64(withdrawalEpoch); - withdrawal.validatorFieldsProofs = new bytes[](1); - withdrawal.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); - - { - /** - * Generate proofs then root for subtree: - * - * beaconStateRoot - * - validatorFieldsRoot (withdrawal.validatorFieldsProofs[0]) - * - blockRoot (historical summaries) (withdrawalProof.historicalSummaryBlockRootProof) - */ - withdrawal.stateRootProof.beaconStateRoot = _genBeaconStateRootProofs({ - withdrawalProof: withdrawalProof, - validatorFieldsProof: withdrawal.validatorFieldsProofs[0], - validatorIndex: validator.validatorIndex, - validatorRoot: Merkle.merkleizeSha256(withdrawal.validatorFields[0]) - }); - } - - withdrawal.withdrawalProofs = new BeaconChainProofs.WithdrawalProof[](1); - withdrawal.withdrawalProofs[0] = withdrawalProof; - - // Calculate beaconBlockRoot using beaconStateRoot and an empty proof: - withdrawal.stateRootProof.proof = new bytes(BLOCKROOT_PROOF_LEN); - bytes32 beaconBlockRoot = Merkle.processInclusionProofSha256({ - proof: withdrawal.stateRootProof.proof, - leaf: withdrawal.stateRootProof.beaconStateRoot, - index: BeaconChainProofs.STATE_ROOT_INDEX - }); - - // Send the block root to the oracle - oracle.setBlockRoot(withdrawal.oracleTimestamp, beaconBlockRoot); - return withdrawal; - } - - function _genBalanceUpdateProof(Validator memory validator) internal returns (BalanceUpdate memory) { - BalanceUpdate memory update; - - update.validatorIndices = new uint40[](1); - update.validatorIndices[0] = validator.validatorIndex; - - // Create validatorFields showing the balance update - update.validatorFields = new bytes32[][](1); - update.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); - update.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; - update.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = - bytes32(validator.withdrawalCreds); - update.validatorFields[0][BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = - _toLittleEndianUint64(validator.effectiveBalanceGwei); - - // Calculate beaconStateRoot using validator index and an empty proof: - update.validatorFieldsProofs = new bytes[](1); - update.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); - bytes32 validatorRoot = Merkle.merkleizeSha256(update.validatorFields[0]); - uint index = _calcValProofIndex(validator.validatorIndex); - - bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - proof: update.validatorFieldsProofs[0], - leaf: validatorRoot, - index: index - }); - - // Calculate blockRoot using beaconStateRoot and an empty proof: - bytes memory blockRootProof = new bytes(BLOCKROOT_PROOF_LEN); - bytes32 blockRoot = Merkle.processInclusionProofSha256({ - proof: blockRootProof, - leaf: beaconStateRoot, - index: BeaconChainProofs.STATE_ROOT_INDEX - }); - - update.stateRootProof = BeaconChainProofs.StateRootProof({ - beaconStateRoot: beaconStateRoot, - proof: blockRootProof - }); - - // Send the block root to the oracle and increment timestamp: - update.oracleTimestamp = uint64(nextTimestamp); - oracle.setBlockRoot(nextTimestamp, blockRoot); - nextTimestamp++; + // withdrawal.validatorFieldsProofs = new bytes[](1); + // withdrawal.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); + + // { + // /** + // * Generate proofs then root for subtree: + // * + // * beaconStateRoot + // * - validatorFieldsRoot (withdrawal.validatorFieldsProofs[0]) + // * - blockRoot (historical summaries) (withdrawalProof.historicalSummaryBlockRootProof) + // */ + // withdrawal.stateRootProof.beaconStateRoot = _genBeaconStateRootProofs({ + // withdrawalProof: withdrawalProof, + // validatorFieldsProof: withdrawal.validatorFieldsProofs[0], + // validatorIndex: validator.validatorIndex, + // validatorRoot: Merkle.merkleizeSha256(withdrawal.validatorFields[0]) + // }); + // } + + // withdrawal.withdrawalProofs = new BeaconChainProofs.WithdrawalProof[](1); + // withdrawal.withdrawalProofs[0] = withdrawalProof; + + // // Calculate beaconBlockRoot using beaconStateRoot and an empty proof: + // withdrawal.stateRootProof.proof = new bytes(BLOCKROOT_PROOF_LEN); + // bytes32 beaconBlockRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawal.stateRootProof.proof, + // leaf: withdrawal.stateRootProof.beaconStateRoot, + // index: BeaconChainProofs.STATE_ROOT_INDEX + // }); + + // // Send the block root to the oracle + // oracle.setBlockRoot(withdrawal.oracleTimestamp, beaconBlockRoot); + // return withdrawal; + // } + + // function _genBalanceUpdateProof(Validator memory validator) internal returns (BalanceUpdate memory) { + // BalanceUpdate memory update; + + // update.validatorIndices = new uint40[](1); + // update.validatorIndices[0] = validator.validatorIndex; + + // // Create validatorFields showing the balance update + // update.validatorFields = new bytes32[][](1); + // update.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); + // update.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; + // update.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = + // bytes32(validator.withdrawalCreds); + // update.validatorFields[0][BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = + // _toLittleEndianUint64(validator.effectiveBalanceGwei); + + // // Calculate beaconStateRoot using validator index and an empty proof: + // update.validatorFieldsProofs = new bytes[](1); + // update.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); + // bytes32 validatorRoot = Merkle.merkleizeSha256(update.validatorFields[0]); + // uint index = _calcValProofIndex(validator.validatorIndex); + + // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ + // proof: update.validatorFieldsProofs[0], + // leaf: validatorRoot, + // index: index + // }); + + // // Calculate blockRoot using beaconStateRoot and an empty proof: + // bytes memory blockRootProof = new bytes(BLOCKROOT_PROOF_LEN); + // bytes32 blockRoot = Merkle.processInclusionProofSha256({ + // proof: blockRootProof, + // leaf: beaconStateRoot, + // index: BeaconChainProofs.STATE_ROOT_INDEX + // }); + + // update.stateRootProof = BeaconChainProofs.StateRootProof({ + // beaconStateRoot: beaconStateRoot, + // proof: blockRootProof + // }); + + // // Send the block root to the oracle and increment timestamp: + // update.oracleTimestamp = uint64(nextTimestamp); + // oracle.setBlockRoot(nextTimestamp, blockRoot); + // nextTimestamp++; - return update; - } + // return update; + // } /** * @dev Generates converging merkle proofs for timestampRoot and withdrawalRoot @@ -408,49 +408,49 @@ contract BeaconChainMock is Test { * * @return executionPayloadRoot */ - function _genExecPayloadProofs( - BeaconChainProofs.WithdrawalProof memory withdrawalProof, - bytes32 withdrawalRoot - ) internal view returns (bytes32) { - - uint withdrawalProofIndex = - (BeaconChainProofs.WITHDRAWALS_INDEX << (BeaconChainProofs.WITHDRAWALS_TREE_HEIGHT + 1)) | - uint(withdrawalProof.withdrawalIndex); - - /** - * Generate merkle proofs for timestampRoot and withdrawalRoot - * that converge at or before executionPayloadRoot. - * - * timestampProof length: 4 - * withdrawalProof length: 9 - */ - _genConvergentProofs({ - shortProof: withdrawalProof.timestampProof, - shortIndex: BeaconChainProofs.TIMESTAMP_INDEX, - shortLeaf: withdrawalProof.timestampRoot, - longProof: withdrawalProof.withdrawalProof, - longIndex: withdrawalProofIndex, - longLeaf: withdrawalRoot - }); - - // Use generated proofs to calculate tree root and verify both proofs - // result in the same root: - bytes32 execPayloadRoot = Merkle.processInclusionProofSha256({ - proof: withdrawalProof.timestampProof, - leaf: withdrawalProof.timestampRoot, - index: BeaconChainProofs.TIMESTAMP_INDEX - }); - - bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - proof: withdrawalProof.withdrawalProof, - leaf: withdrawalRoot, - index: withdrawalProofIndex - }); - - require(execPayloadRoot == expectedRoot, "_genExecPayloadProofs: mismatched roots"); + // function _genExecPayloadProofs( + // BeaconChainProofs.WithdrawalProof memory withdrawalProof, + // bytes32 withdrawalRoot + // ) internal view returns (bytes32) { + + // uint withdrawalProofIndex = + // (BeaconChainProofs.WITHDRAWALS_INDEX << (BeaconChainProofs.WITHDRAWALS_TREE_HEIGHT + 1)) | + // uint(withdrawalProof.withdrawalIndex); + + // /** + // * Generate merkle proofs for timestampRoot and withdrawalRoot + // * that converge at or before executionPayloadRoot. + // * + // * timestampProof length: 4 + // * withdrawalProof length: 9 + // */ + // _genConvergentProofs({ + // shortProof: withdrawalProof.timestampProof, + // shortIndex: BeaconChainProofs.TIMESTAMP_INDEX, + // shortLeaf: withdrawalProof.timestampRoot, + // longProof: withdrawalProof.withdrawalProof, + // longIndex: withdrawalProofIndex, + // longLeaf: withdrawalRoot + // }); + + // // Use generated proofs to calculate tree root and verify both proofs + // // result in the same root: + // bytes32 execPayloadRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawalProof.timestampProof, + // leaf: withdrawalProof.timestampRoot, + // index: BeaconChainProofs.TIMESTAMP_INDEX + // }); + + // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawalProof.withdrawalProof, + // leaf: withdrawalRoot, + // index: withdrawalProofIndex + // }); + + // require(execPayloadRoot == expectedRoot, "_genExecPayloadProofs: mismatched roots"); - return execPayloadRoot; - } + // return execPayloadRoot; + // } /** * @dev Generates converging merkle proofs for slotRoot and executionPayloadRoot @@ -461,49 +461,49 @@ contract BeaconChainMock is Test { * * @return historical summary block root */ - function _genBlockRootProofs( - BeaconChainProofs.WithdrawalProof memory withdrawalProof - ) internal view returns (bytes32) { - - uint slotRootIndex = BeaconChainProofs.SLOT_INDEX; - uint execPayloadIndex = - (BeaconChainProofs.BODY_ROOT_INDEX << BeaconChainProofs.BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT) | - BeaconChainProofs.EXECUTION_PAYLOAD_INDEX; - - /** - * Generate merkle proofs for slotRoot and executionPayloadRoot - * that converge at or before block root. - * - * slotProof length: 3 - * executionPayloadProof length: 7 - */ - _genConvergentProofs({ - shortProof: withdrawalProof.slotProof, - shortIndex: slotRootIndex, - shortLeaf: withdrawalProof.slotRoot, - longProof: withdrawalProof.executionPayloadProof, - longIndex: execPayloadIndex, - longLeaf: withdrawalProof.executionPayloadRoot - }); - - // Use generated proofs to calculate tree root and verify both proofs - // result in the same root: - bytes32 blockRoot = Merkle.processInclusionProofSha256({ - proof: withdrawalProof.slotProof, - leaf: withdrawalProof.slotRoot, - index: slotRootIndex - }); - - bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - proof: withdrawalProof.executionPayloadProof, - leaf: withdrawalProof.executionPayloadRoot, - index: execPayloadIndex - }); - - require(blockRoot == expectedRoot, "_genBlockRootProofs: mismatched roots"); + // function _genBlockRootProofs( + // BeaconChainProofs.WithdrawalProof memory withdrawalProof + // ) internal view returns (bytes32) { + + // uint slotRootIndex = BeaconChainProofs.SLOT_INDEX; + // uint execPayloadIndex = + // (BeaconChainProofs.BODY_ROOT_INDEX << BeaconChainProofs.BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT) | + // BeaconChainProofs.EXECUTION_PAYLOAD_INDEX; + + // /** + // * Generate merkle proofs for slotRoot and executionPayloadRoot + // * that converge at or before block root. + // * + // * slotProof length: 3 + // * executionPayloadProof length: 7 + // */ + // _genConvergentProofs({ + // shortProof: withdrawalProof.slotProof, + // shortIndex: slotRootIndex, + // shortLeaf: withdrawalProof.slotRoot, + // longProof: withdrawalProof.executionPayloadProof, + // longIndex: execPayloadIndex, + // longLeaf: withdrawalProof.executionPayloadRoot + // }); + + // // Use generated proofs to calculate tree root and verify both proofs + // // result in the same root: + // bytes32 blockRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawalProof.slotProof, + // leaf: withdrawalProof.slotRoot, + // index: slotRootIndex + // }); + + // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawalProof.executionPayloadProof, + // leaf: withdrawalProof.executionPayloadRoot, + // index: execPayloadIndex + // }); + + // require(blockRoot == expectedRoot, "_genBlockRootProofs: mismatched roots"); - return blockRoot; - } + // return blockRoot; + // } /** * @dev Generates converging merkle proofs for block root and validatorRoot @@ -514,49 +514,49 @@ contract BeaconChainMock is Test { * * @return beaconStateRoot */ - function _genBeaconStateRootProofs( - BeaconChainProofs.WithdrawalProof memory withdrawalProof, - bytes memory validatorFieldsProof, - uint40 validatorIndex, - bytes32 validatorRoot - ) internal view returns (bytes32) { - uint blockHeaderIndex = _calcBlockHeaderIndex(withdrawalProof); - uint validatorProofIndex = _calcValProofIndex(validatorIndex); - - /** - * Generate merkle proofs for validatorRoot and blockRoot - * that converge at or before beaconStateRoot. - * - * historicalSummaryBlockRootProof length: 44 - * validatorFieldsProof length: 46 - */ - _genConvergentProofs({ - shortProof: withdrawalProof.historicalSummaryBlockRootProof, - shortIndex: blockHeaderIndex, - shortLeaf: withdrawalProof.blockRoot, - longProof: validatorFieldsProof, - longIndex: validatorProofIndex, - longLeaf: validatorRoot - }); - - // Use generated proofs to calculate tree root and verify both proofs - // result in the same root: - bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - proof: withdrawalProof.historicalSummaryBlockRootProof, - leaf: withdrawalProof.blockRoot, - index: blockHeaderIndex - }); - - bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - proof: validatorFieldsProof, - leaf: validatorRoot, - index: validatorProofIndex - }); - - require(beaconStateRoot == expectedRoot, "_genBeaconStateRootProofs: mismatched roots"); + // function _genBeaconStateRootProofs( + // BeaconChainProofs.WithdrawalProof memory withdrawalProof, + // bytes memory validatorFieldsProof, + // uint40 validatorIndex, + // bytes32 validatorRoot + // ) internal view returns (bytes32) { + // uint blockHeaderIndex = _calcBlockHeaderIndex(withdrawalProof); + // uint validatorProofIndex = _calcValProofIndex(validatorIndex); + + // /** + // * Generate merkle proofs for validatorRoot and blockRoot + // * that converge at or before beaconStateRoot. + // * + // * historicalSummaryBlockRootProof length: 44 + // * validatorFieldsProof length: 46 + // */ + // _genConvergentProofs({ + // shortProof: withdrawalProof.historicalSummaryBlockRootProof, + // shortIndex: blockHeaderIndex, + // shortLeaf: withdrawalProof.blockRoot, + // longProof: validatorFieldsProof, + // longIndex: validatorProofIndex, + // longLeaf: validatorRoot + // }); + + // // Use generated proofs to calculate tree root and verify both proofs + // // result in the same root: + // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ + // proof: withdrawalProof.historicalSummaryBlockRootProof, + // leaf: withdrawalProof.blockRoot, + // index: blockHeaderIndex + // }); + + // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ + // proof: validatorFieldsProof, + // leaf: validatorRoot, + // index: validatorProofIndex + // }); + + // require(beaconStateRoot == expectedRoot, "_genBeaconStateRootProofs: mismatched roots"); - return beaconStateRoot; - } + // return beaconStateRoot; + // } /** * @dev Generates converging merkle proofs given two leaves and empty proofs. @@ -736,43 +736,43 @@ contract BeaconChainMock is Test { BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 1 ); - function _initWithdrawalProof( - uint64 withdrawalEpoch, - uint64 withdrawalIndex, - uint64 oracleTimestamp - ) internal view returns (BeaconChainProofs.WithdrawalProof memory) { - uint256 withdrawalProofLength; - uint256 timestampProofLength; - if (block.timestamp > eigenPodManager.denebForkTimestamp()) { - withdrawalProofLength = WITHDRAWAL_PROOF_LEN_DENEB; - timestampProofLength = TIMESTAMP_PROOF_LEN_DENEB; - } else { - withdrawalProofLength = WITHDRAWAL_PROOF_LEN_CAPELLA; - timestampProofLength = TIMESTAMP_PROOF_LEN_CAPELLA; - } - return BeaconChainProofs.WithdrawalProof({ - withdrawalProof: new bytes(withdrawalProofLength), - slotProof: new bytes(SLOT_PROOF_LEN), - executionPayloadProof: new bytes(EXECPAYLOAD_PROOF_LEN), - timestampProof: new bytes(timestampProofLength), - historicalSummaryBlockRootProof: new bytes(HISTSUMMARY_PROOF_LEN), - blockRootIndex: 0, - historicalSummaryIndex: 0, - withdrawalIndex: withdrawalIndex, - blockRoot: bytes32(0), - slotRoot: _toLittleEndianUint64(withdrawalEpoch * BeaconChainProofs.SLOTS_PER_EPOCH), - timestampRoot: _toLittleEndianUint64(oracleTimestamp), - executionPayloadRoot: bytes32(0) - }); - } - - function _calcBlockHeaderIndex(BeaconChainProofs.WithdrawalProof memory withdrawalProof) internal view returns (uint) { - return - HIST_SUMMARIES_PROOF_INDEX | - (uint(withdrawalProof.historicalSummaryIndex) << (BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 1)) | - (BeaconChainProofs.BLOCK_SUMMARY_ROOT_INDEX << BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT) | - uint(withdrawalProof.blockRootIndex); - } + // function _initWithdrawalProof( + // uint64 withdrawalEpoch, + // uint64 withdrawalIndex, + // uint64 oracleTimestamp + // ) internal view returns (BeaconChainProofs.WithdrawalProof memory) { + // uint256 withdrawalProofLength; + // uint256 timestampProofLength; + // if (block.timestamp > eigenPodManager.denebForkTimestamp()) { + // withdrawalProofLength = WITHDRAWAL_PROOF_LEN_DENEB; + // timestampProofLength = TIMESTAMP_PROOF_LEN_DENEB; + // } else { + // withdrawalProofLength = WITHDRAWAL_PROOF_LEN_CAPELLA; + // timestampProofLength = TIMESTAMP_PROOF_LEN_CAPELLA; + // } + // return BeaconChainProofs.WithdrawalProof({ + // withdrawalProof: new bytes(withdrawalProofLength), + // slotProof: new bytes(SLOT_PROOF_LEN), + // executionPayloadProof: new bytes(EXECPAYLOAD_PROOF_LEN), + // timestampProof: new bytes(timestampProofLength), + // historicalSummaryBlockRootProof: new bytes(HISTSUMMARY_PROOF_LEN), + // blockRootIndex: 0, + // historicalSummaryIndex: 0, + // withdrawalIndex: withdrawalIndex, + // blockRoot: bytes32(0), + // slotRoot: _toLittleEndianUint64(withdrawalEpoch * BeaconChainProofs.SLOTS_PER_EPOCH), + // timestampRoot: _toLittleEndianUint64(oracleTimestamp), + // executionPayloadRoot: bytes32(0) + // }); + // } + + // function _calcBlockHeaderIndex(BeaconChainProofs.WithdrawalProof memory withdrawalProof) internal view returns (uint) { + // return + // HIST_SUMMARIES_PROOF_INDEX | + // (uint(withdrawalProof.historicalSummaryIndex) << (BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 1)) | + // (BeaconChainProofs.BLOCK_SUMMARY_ROOT_INDEX << BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT) | + // uint(withdrawalProof.blockRootIndex); + // } function _calcValProofIndex(uint40 validatorIndex) internal pure returns (uint) { return diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index ca304c844..8db15b699 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -114,7 +114,7 @@ contract User is Test { validators.push(newValidatorIndex); emit log_named_uint("oracle timestamp", proofs.oracleTimestamp); pod.verifyWithdrawalCredentials({ - oracleTimestamp: proofs.oracleTimestamp, + beaconTimestamp: proofs.oracleTimestamp, stateRootProof: proofs.stateRootProof, validatorIndices: proofs.validatorIndices, validatorFieldsProofs: proofs.validatorFieldsProofs, @@ -131,37 +131,38 @@ contract User is Test { function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public createSnapshot virtual { emit log(_name(".updateBalances")); - - for (uint i = 0; i < strategies.length; i++) { - IStrategy strat = strategies[i]; - int delta = tokenDeltas[i]; - - if (strat == BEACONCHAIN_ETH_STRAT) { - // TODO - right now, we just grab the first validator - uint40 validator = getUpdatableValidator(); - BalanceUpdate memory update = beaconChain.updateBalance(validator, delta); - - int sharesBefore = eigenPodManager.podOwnerShares(address(this)); - - pod.verifyBalanceUpdates({ - oracleTimestamp: update.oracleTimestamp, - validatorIndices: update.validatorIndices, - stateRootProof: update.stateRootProof, - validatorFieldsProofs: update.validatorFieldsProofs, - validatorFields: update.validatorFields - }); - - int sharesAfter = eigenPodManager.podOwnerShares(address(this)); - - emit log_named_int("pod owner shares before: ", sharesBefore); - emit log_named_int("pod owner shares after: ", sharesAfter); - } else { - uint tokens = uint(delta); - IERC20 underlyingToken = strat.underlyingToken(); - underlyingToken.approve(address(strategyManager), tokens); - strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); - } - } + revert("fail - placeholder"); + + // for (uint i = 0; i < strategies.length; i++) { + // IStrategy strat = strategies[i]; + // int delta = tokenDeltas[i]; + + // if (strat == BEACONCHAIN_ETH_STRAT) { + // // TODO - right now, we just grab the first validator + // uint40 validator = getUpdatableValidator(); + // BalanceUpdate memory update = beaconChain.updateBalance(validator, delta); + + // int sharesBefore = eigenPodManager.podOwnerShares(address(this)); + + // pod.verifyBalanceUpdates({ + // oracleTimestamp: update.oracleTimestamp, + // validatorIndices: update.validatorIndices, + // stateRootProof: update.stateRootProof, + // validatorFieldsProofs: update.validatorFieldsProofs, + // validatorFields: update.validatorFields + // }); + + // int sharesAfter = eigenPodManager.podOwnerShares(address(this)); + + // emit log_named_int("pod owner shares before: ", sharesBefore); + // emit log_named_int("pod owner shares after: ", sharesAfter); + // } else { + // uint tokens = uint(delta); + // IERC20 underlyingToken = strat.underlyingToken(); + // underlyingToken.approve(address(strategyManager), tokens); + // strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); + // } + // } } /// @dev Delegate to the operator without a signature @@ -301,30 +302,31 @@ contract User is Test { if (receiveAsTokens) { emit log("exiting validators and processing withdrawals..."); - - uint numValidators = validators.length; - for (uint j = 0; j < numValidators; j++) { - emit log_named_uint("exiting validator ", j); - - uint40 validatorIndex = validators[j]; - BeaconWithdrawal memory proofs = beaconChain.exitValidator(validatorIndex); - - uint64 withdrawableBefore = pod.withdrawableRestakedExecutionLayerGwei(); - - pod.verifyAndProcessWithdrawals({ - oracleTimestamp: proofs.oracleTimestamp, - stateRootProof: proofs.stateRootProof, - withdrawalProofs: proofs.withdrawalProofs, - validatorFieldsProofs: proofs.validatorFieldsProofs, - validatorFields: proofs.validatorFields, - withdrawalFields: proofs.withdrawalFields - }); + revert("fail - placeholder"); + + // uint numValidators = validators.length; + // for (uint j = 0; j < numValidators; j++) { + // emit log_named_uint("exiting validator ", j); + + // uint40 validatorIndex = validators[j]; + // BeaconWithdrawal memory proofs = beaconChain.exitValidator(validatorIndex); + + // uint64 withdrawableBefore = pod.withdrawableRestakedExecutionLayerGwei(); + + // pod.verifyAndProcessWithdrawals({ + // oracleTimestamp: proofs.oracleTimestamp, + // stateRootProof: proofs.stateRootProof, + // withdrawalProofs: proofs.withdrawalProofs, + // validatorFieldsProofs: proofs.validatorFieldsProofs, + // validatorFields: proofs.validatorFields, + // withdrawalFields: proofs.withdrawalFields + // }); - uint64 withdrawableAfter = pod.withdrawableRestakedExecutionLayerGwei(); + // uint64 withdrawableAfter = pod.withdrawableRestakedExecutionLayerGwei(); - emit log_named_uint("pod withdrawable before: ", withdrawableBefore); - emit log_named_uint("pod withdrawable after: ", withdrawableAfter); - } + // emit log_named_uint("pod withdrawable before: ", withdrawableBefore); + // emit log_named_uint("pod withdrawable after: ", withdrawableAfter); + // } } } else { tokens[i] = strat.underlyingToken(); @@ -438,7 +440,7 @@ contract User_AltMethods is User { validators.push(newValidatorIndex); pod.verifyWithdrawalCredentials({ - oracleTimestamp: proofs.oracleTimestamp, + beaconTimestamp: proofs.oracleTimestamp, stateRootProof: proofs.stateRootProof, validatorIndices: proofs.validatorIndices, validatorFieldsProofs: proofs.validatorFieldsProofs, diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index 96da69030..308b2e553 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -18,8 +18,6 @@ contract EigenPodManagerMock is IEigenPodManager, Test { function stake(bytes calldata /*pubkey*/, bytes calldata /*signature*/, bytes32 /*depositDataRoot*/) external payable {} function recordBeaconChainETHBalanceUpdate(address /*podOwner*/, int256 /*sharesDelta*/) external pure {} - - function updateBeaconChainOracle(IBeaconChainOracle /*newBeaconChainOracle*/) external pure {} function ownerToPod(address /*podOwner*/) external pure returns(IEigenPod) { return IEigenPod(address(0)); @@ -29,14 +27,6 @@ contract EigenPodManagerMock is IEigenPodManager, Test { return IEigenPod(podOwner); } - function beaconChainOracle() external pure returns(IBeaconChainOracle) { - return IBeaconChainOracle(address(0)); - } - - function getBlockRootAtTimestamp(uint64 /*timestamp*/) external pure returns(bytes32) { - return bytes32(0); - } - function strategyManager() external pure returns(IStrategyManager) { return IStrategyManager(address(0)); } @@ -84,6 +74,12 @@ contract EigenPodManagerMock is IEigenPodManager, Test { function numPods() external view returns (uint256) {} + function getParentBlockRoot(uint64 timestamp) external view returns (bytes32) { + return bytes32(0); + } + + function updateStaleValidatorCount(address, int256) external {} + function denebForkTimestamp() external pure returns (uint64) { return type(uint64).max; } diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol index 38b515018..e6e9f5785 100644 --- a/src/test/mocks/EigenPodMock.sol +++ b/src/test/mocks/EigenPodMock.sol @@ -5,8 +5,6 @@ import "forge-std/Test.sol"; import "../../contracts/interfaces/IEigenPod.sol"; contract EigenPodMock is IEigenPod, Test { - /// @notice The max amount of eth, in gwei, that can be restaked per validator - function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() external view returns(uint64) {} function nonBeaconChainETHBalanceWei() external view returns(uint256) {} @@ -42,10 +40,6 @@ contract EigenPodMock is IEigenPod, Test { /// @notice Returns the validatorInfo struct for the provided pubkeyHash function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory) {} - - ///@notice mapping that tracks proven withdrawals - function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external view returns (bool) {} - /// @notice This returns the status of a given validator function validatorStatus(bytes32 pubkeyHash) external view returns(VALIDATOR_STATUS) {} @@ -58,24 +52,6 @@ contract EigenPodMock is IEigenPod, Test { bytes32[][] calldata validatorFields ) external {} - - function verifyBalanceUpdates( - uint64 oracleTimestamp, - uint40[] calldata validatorIndices, - BeaconChainProofs.StateRootProof calldata stateRootProof, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields - ) external {} - - function verifyAndProcessWithdrawals( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields, - bytes32[][] calldata withdrawalFields - ) external {} - /// @notice Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false function activateRestaking() external {} diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol index ca33ffde0..bae07413f 100644 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ b/src/test/unit/EigenPod-PodManagerUnit.t.sol @@ -65,7 +65,6 @@ contract EigenPod_PodManager_UnitTests is EigenLayerUnitTestSetup { ethPOSMock, delayedWithdrawalRouterMock, eigenPodManager, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -142,45 +141,45 @@ contract EigenPod_PodManager_UnitTests_EigenPodPausing is EigenPod_PodManager_Un /// @notice Index for flag that pauses the `verifyBeaconChainFullWithdrawal` function *of the EigenPods* when set. see EigenPod code for details. uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; - function test_verifyBalanceUpdates_revert_pausedEigenVerifyBalanceUpdate() public { - BeaconChainProofs.StateRootProof memory stateRootProofStruct; + // function test_verifyBalanceUpdates_revert_pausedEigenVerifyBalanceUpdate() public { + // BeaconChainProofs.StateRootProof memory stateRootProofStruct; - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - bytes[] memory proofsArray = new bytes[](1); - uint40[] memory validatorIndices = new uint40[](1); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // bytes[] memory proofsArray = new bytes[](1); + // uint40[] memory validatorIndices = new uint40[](1); - // pause the contract - cheats.prank(address(pauser)); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); + // // pause the contract + // cheats.prank(address(pauser)); + // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); - cheats.prank(address(podOwner)); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - eigenPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofsArray, validatorFieldsArray); - } - - function test_verifyAndProcessWithdrawals_revert_pausedEigenVerifyWithdrawal() public { - BeaconChainProofs.StateRootProof memory stateRootProofStruct; - BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray; - - bytes[] memory validatorFieldsProofArray = new bytes[](1); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - - // pause the contract - cheats.prank(address(pauser)); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_WITHDRAWAL); + // cheats.prank(address(podOwner)); + // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); + // eigenPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofsArray, validatorFieldsArray); + // } - cheats.prank(address(podOwner)); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - eigenPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofsArray, - validatorFieldsProofArray, - validatorFieldsArray, - withdrawalFieldsArray - ); - } + // function test_verifyAndProcessWithdrawals_revert_pausedEigenVerifyWithdrawal() public { + // BeaconChainProofs.StateRootProof memory stateRootProofStruct; + // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray; + + // bytes[] memory validatorFieldsProofArray = new bytes[](1); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); + + // // pause the contract + // cheats.prank(address(pauser)); + // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_WITHDRAWAL); + + // cheats.prank(address(podOwner)); + // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); + // eigenPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofsArray, + // validatorFieldsProofArray, + // validatorFieldsArray, + // withdrawalFieldsArray + // ); + // } function test_verifyWithdrawalCredentials_revert_pausedEigenVerifyCredentials() public { BeaconChainProofs.StateRootProof memory stateRootProofStruct; @@ -266,7 +265,7 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un bytes[] validatorFieldsProofs; bytes32[][] validatorFields; // BeaconChainProofs.BalanceUpdateProof[] balanceUpdateProof; - BeaconChainProofs.WithdrawalProof[] withdrawalProofs; + // BeaconChainProofs.WithdrawalProof[] withdrawalProofs; bytes32[][] withdrawalFields; function test_verifyWithdrawalCredentials() public { @@ -298,223 +297,223 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un assertEq(updatedShares, 32e18, "Shares should be 32ETH in wei after verifying withdrawal credentials"); } - function test_balanceUpdate_negativeSharesDelta() public { - // Verify withdrawal credentials - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _verifyWithdrawalCredentials(); - - // Set JSON - setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); - bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // Set proof params, oracle block root, and warp time - _setBalanceUpdateParams(); - _setOracleBlockRoot(); - cheats.warp(GOERLI_GENESIS_TIME); - uint64 oracleTimestamp = uint64(block.timestamp); - - // Save state for checks - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); - - // Verify balance update - eigenPod.verifyBalanceUpdates( - oracleTimestamp, - validatorIndices, - stateRootProofStruct, - validatorFieldsProofs, - validatorFields - ); - - // Checks - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei is incorrect"); - assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); - int256 expectedSharesDiff = (int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; - assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta should be equal to restaked balance"); - } - - function test_balanceUpdate_positiveSharesDelta() public { - // Verify withdrawal credentials - setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - _verifyWithdrawalCredentials(); - - // Set JSON - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // Set proof params, oracle block root, and warp time - _setBalanceUpdateParams(); - _setOracleBlockRoot(); - cheats.warp(GOERLI_GENESIS_TIME); - uint64 oracleTimestamp = uint64(block.timestamp); - - // Save state for checks - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); + // function test_balanceUpdate_negativeSharesDelta() public { + // // Verify withdrawal credentials + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _verifyWithdrawalCredentials(); + + // // Set JSON + // setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); + // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); + + // // Set proof params, oracle block root, and warp time + // _setBalanceUpdateParams(); + // _setOracleBlockRoot(); + // cheats.warp(GOERLI_GENESIS_TIME); + // uint64 oracleTimestamp = uint64(block.timestamp); + + // // Save state for checks + // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + // uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); + + // // Verify balance update + // eigenPod.verifyBalanceUpdates( + // oracleTimestamp, + // validatorIndices, + // stateRootProofStruct, + // validatorFieldsProofs, + // validatorFields + // ); - // Verify balance update - eigenPod.verifyBalanceUpdates( - oracleTimestamp, - validatorIndices, - stateRootProofStruct, - validatorFieldsProofs, - validatorFields - ); + // // Checks + // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); + // assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei is incorrect"); + // assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); + // int256 expectedSharesDiff = (int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; + // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta should be equal to restaked balance"); + // } - // Checks - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - assertGt(updatedShares - initialShares, 0, "Shares delta should be positive"); - assertEq(updatedShares, 32e18, "Shares should be 32ETH"); - assertEq(newValidatorBalance, 32e9, "validator balance should be 32e9 Gwei"); - } + // function test_balanceUpdate_positiveSharesDelta() public { + // // Verify withdrawal credentials + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); + // _verifyWithdrawalCredentials(); + + // // Set JSON + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); + + // // Set proof params, oracle block root, and warp time + // _setBalanceUpdateParams(); + // _setOracleBlockRoot(); + // cheats.warp(GOERLI_GENESIS_TIME); + // uint64 oracleTimestamp = uint64(block.timestamp); + + // // Save state for checks + // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + // uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); + + // // Verify balance update + // eigenPod.verifyBalanceUpdates( + // oracleTimestamp, + // validatorIndices, + // stateRootProofStruct, + // validatorFieldsProofs, + // validatorFields + // ); - function test_fullWithdrawal_excess32ETH() public { - // Verify withdrawal credentials - setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - _verifyWithdrawalCredentials(); + // // Checks + // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); + // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); + // assertGt(updatedShares - initialShares, 0, "Shares delta should be positive"); + // assertEq(updatedShares, 32e18, "Shares should be 32ETH"); + // assertEq(newValidatorBalance, 32e9, "validator balance should be 32e9 Gwei"); + // } - // Set JSON - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); + // function test_fullWithdrawal_excess32ETH() public { + // // Verify withdrawal credentials + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); + // _verifyWithdrawalCredentials(); - // Set proof params, block root - _setWithdrawalProofParams(); - _setOracleBlockRoot(); + // // Set JSON + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - // Save state for checks; deal EigenPod withdrawal router balance - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * 1e9; - cheats.deal(address(eigenPod), leftOverBalanceWEI); - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + // // Set proof params, block root + // _setWithdrawalProofParams(); + // _setOracleBlockRoot(); - // Withdraw - eigenPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofs, - validatorFieldsProofs, - validatorFields, - withdrawalFields - ); + // // Save state for checks; deal EigenPod withdrawal router balance + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * 1e9; + // cheats.deal(address(eigenPod), leftOverBalanceWEI); + // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + + // // Withdraw + // eigenPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofs, + // validatorFieldsProofs, + // validatorFields, + // withdrawalFields + // ); - // Checks - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - assertGt(updatedShares - initialShares, 0, "Shares diff should be positive"); - int256 expectedSharesDiff = (int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))*1e9) - initialShares; - assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); - assertEq(updatedShares, 32e18, "Shares should be 32e18"); - assertEq(address(delayedWithdrawalRouterMock).balance, leftOverBalanceWEI, "Incorrect amount sent to delayed withdrawal router"); - } + // // Checks + // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); + // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); + // assertGt(updatedShares - initialShares, 0, "Shares diff should be positive"); + // int256 expectedSharesDiff = (int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))*1e9) - initialShares; + // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); + // assertEq(updatedShares, 32e18, "Shares should be 32e18"); + // assertEq(address(delayedWithdrawalRouterMock).balance, leftOverBalanceWEI, "Incorrect amount sent to delayed withdrawal router"); + // } - function test_withdrawRestakedBeaconChainETH() public { - test_fullWithdrawal_excess32ETH(); + // function test_withdrawRestakedBeaconChainETH() public { + // test_fullWithdrawal_excess32ETH(); - // Deal eigenPod balance - max restaked balance - cheats.deal(address(eigenPod), 32 ether); + // // Deal eigenPod balance - max restaked balance + // cheats.deal(address(eigenPod), 32 ether); - cheats.startPrank(address(delegationManagerMock)); - vm.expectEmit(true, true, true, true); - emit RestakedBeaconChainETHWithdrawn(podOwner, 32 ether); - eigenPodManager.withdrawSharesAsTokens( - podOwner, - podOwner, - uint256(eigenPodManager.podOwnerShares(podOwner)) - ); - cheats.stopPrank(); - - // Checks - assertEq(address(podOwner).balance, 32 ether, "EigenPod balance should be 0"); - assertEq(address(eigenPod).balance, 0, "EigenPod balance should be 0"); - assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), 0, "Restaked execution layer gwei should be 0"); - } + // cheats.startPrank(address(delegationManagerMock)); + // vm.expectEmit(true, true, true, true); + // emit RestakedBeaconChainETHWithdrawn(podOwner, 32 ether); + // eigenPodManager.withdrawSharesAsTokens( + // podOwner, + // podOwner, + // uint256(eigenPodManager.podOwnerShares(podOwner)) + // ); + // cheats.stopPrank(); - function test_fullWithdrawal_less32ETH() public { - // Verify withdrawal credentials - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _verifyWithdrawalCredentials(); + // // Checks + // assertEq(address(podOwner).balance, 32 ether, "EigenPod balance should be 0"); + // assertEq(address(eigenPod).balance, 0, "EigenPod balance should be 0"); + // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), 0, "Restaked execution layer gwei should be 0"); + // } - // Set JSON - setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); - bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); + // function test_fullWithdrawal_less32ETH() public { + // // Verify withdrawal credentials + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _verifyWithdrawalCredentials(); - // Set proof params, block root - _setWithdrawalProofParams(); - _setOracleBlockRoot(); + // // Set JSON + // setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); + // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - // Save State - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + // // Set proof params, block root + // _setWithdrawalProofParams(); + // _setOracleBlockRoot(); - // Withdraw - eigenPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofs, - validatorFieldsProofs, - validatorFields, - withdrawalFields - ); + // // Save State + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + + // // Withdraw + // eigenPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofs, + // validatorFieldsProofs, + // validatorFields, + // withdrawalFields + // ); - // Checks - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei is incorrect"); - assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); - int256 expectedSharesDiff = (int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; - assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); - } + // // Checks + // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); + // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei is incorrect"); + // assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); + // int256 expectedSharesDiff = (int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; + // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); + // } - function test_partialWithdrawal() public { - // Set JSON & params - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _verifyWithdrawalCredentials(); + // function test_partialWithdrawal() public { + // // Set JSON & params + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _verifyWithdrawalCredentials(); - // Set JSON - setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // Set proof params, block root - _setWithdrawalProofParams(); - _setOracleBlockRoot(); + // // Set JSON + // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); + // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - // Assert that partial withdrawal code path will be tested - assertLt(withdrawalProofs[0].getWithdrawalEpoch(), validatorFields[0].getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); + // // Set proof params, block root + // _setWithdrawalProofParams(); + // _setOracleBlockRoot(); - // Save state for checks; deal EigenPod withdrawal router balance - uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - ); - cheats.deal(address(eigenPod), withdrawalAmountGwei * 1e9); // deal full withdrawal amount since it's a partial withdrawal - uint64 initialRestakedBalance = (eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash)).restakedBalanceGwei; - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + // // Assert that partial withdrawal code path will be tested + // assertLt(withdrawalProofs[0].getWithdrawalEpoch(), validatorFields[0].getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); - // Withdraw - eigenPod.verifyAndProcessWithdrawals( - 0, - stateRootProofStruct, - withdrawalProofs, - validatorFieldsProofs, - validatorFields, - withdrawalFields - ); + // // Save state for checks; deal EigenPod withdrawal router balance + // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( + // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] + // ); + // cheats.deal(address(eigenPod), withdrawalAmountGwei * 1e9); // deal full withdrawal amount since it's a partial withdrawal + // uint64 initialRestakedBalance = (eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash)).restakedBalanceGwei; + // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); + + // // Withdraw + // eigenPod.verifyAndProcessWithdrawals( + // 0, + // stateRootProofStruct, + // withdrawalProofs, + // validatorFieldsProofs, + // validatorFields, + // withdrawalFields + // ); - // Checks - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - assertEq(validatorInfo.restakedBalanceGwei, initialRestakedBalance, "Restaked balance gwei should be unchanged"); - assertEq(updatedShares - initialShares, 0, "Shares diff should be 0"); - assertEq(address(delayedWithdrawalRouterMock).balance, withdrawalAmountGwei * 1e9, "Incorrect amount sent to delayed withdrawal router"); - } + // // Checks + // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); + // assertEq(validatorInfo.restakedBalanceGwei, initialRestakedBalance, "Restaked balance gwei should be unchanged"); + // assertEq(updatedShares - initialShares, 0, "Shares diff should be 0"); + // assertEq(address(delayedWithdrawalRouterMock).balance, withdrawalAmountGwei * 1e9, "Incorrect amount sent to delayed withdrawal router"); + // } // Helper Functions function _getStateRootProof() internal returns (BeaconChainProofs.StateRootProof memory) { @@ -566,48 +565,48 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un validatorFieldsProofs.push(abi.encodePacked(getWithdrawalCredentialProof())); // Validator fields are proven here } - function _setBalanceUpdateParams() internal { - // Reset arrays - delete validatorIndices; - delete validatorFields; - delete validatorFieldsProofs; + // function _setBalanceUpdateParams() internal { + // // Reset arrays + // delete validatorIndices; + // delete validatorFields; + // delete validatorFieldsProofs; - // Set state proof struct - stateRootProofStruct = _getStateRootProof(); + // // Set state proof struct + // stateRootProofStruct = _getStateRootProof(); - // Set validator indices - uint40 validatorIndex = uint40(getValidatorIndex()); - validatorIndices.push(validatorIndex); + // // Set validator indices + // uint40 validatorIndex = uint40(getValidatorIndex()); + // validatorIndices.push(validatorIndex); - // Set validatorFieldsArray - validatorFields.push(getValidatorFields()); + // // Set validatorFieldsArray + // validatorFields.push(getValidatorFields()); - // Set validator fields proof - validatorFieldsProofs.push(abi.encodePacked(getBalanceUpdateProof())); // Validator fields are proven here - } + // // Set validator fields proof + // validatorFieldsProofs.push(abi.encodePacked(getBalanceUpdateProof())); // Validator fields are proven here + // } - function _setWithdrawalProofParams() internal { - // Reset arrays - delete validatorFields; - delete validatorFieldsProofs; - delete withdrawalFields; - delete withdrawalProofs; + // function _setWithdrawalProofParams() internal { + // // Reset arrays + // delete validatorFields; + // delete validatorFieldsProofs; + // delete withdrawalFields; + // delete withdrawalProofs; - // Set state proof struct - stateRootProofStruct = _getStateRootProof(); + // // Set state proof struct + // stateRootProofStruct = _getStateRootProof(); - // Set validatorFields - validatorFields.push(getValidatorFields()); + // // Set validatorFields + // validatorFields.push(getValidatorFields()); - // Set validator fields proof - validatorFieldsProofs.push(abi.encodePacked(getValidatorProof())); + // // Set validator fields proof + // validatorFieldsProofs.push(abi.encodePacked(getValidatorProof())); - // Set withdrawal fields - withdrawalFields.push(getWithdrawalFields()); + // // Set withdrawal fields + // withdrawalFields.push(getWithdrawalFields()); - // Set withdrawal proofs - withdrawalProofs.push(_getWithdrawalProof()); - } + // // Set withdrawal proofs + // withdrawalProofs.push(_getWithdrawalProof()); + // } // function _getBalanceUpdateProof() internal returns (BeaconChainProofs.BalanceUpdateProof memory) { // bytes32 balanceRoot = getBalanceRoot(); @@ -620,29 +619,29 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un // } /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - { - bytes32 blockRoot = getBlockRoot(); - bytes32 slotRoot = getSlotRoot(); - bytes32 timestampRoot = getTimestampRoot(); - bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - - return - BeaconChainProofs.WithdrawalProof( - abi.encodePacked(getWithdrawalProofCapella()), - abi.encodePacked(getSlotProof()), - abi.encodePacked(getExecutionPayloadProof()), - abi.encodePacked(getTimestampProofCapella()), - abi.encodePacked(getHistoricalSummaryProof()), - uint64(getBlockRootIndex()), - uint64(getHistoricalSummaryIndex()), - uint64(getWithdrawalIndex()), - blockRoot, - slotRoot, - timestampRoot, - executionPayloadRoot - ); - } - } + // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { + // { + // bytes32 blockRoot = getBlockRoot(); + // bytes32 slotRoot = getSlotRoot(); + // bytes32 timestampRoot = getTimestampRoot(); + // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); + + // return + // BeaconChainProofs.WithdrawalProof( + // abi.encodePacked(getWithdrawalProofCapella()), + // abi.encodePacked(getSlotProof()), + // abi.encodePacked(getExecutionPayloadProof()), + // abi.encodePacked(getTimestampProofCapella()), + // abi.encodePacked(getHistoricalSummaryProof()), + // uint64(getBlockRootIndex()), + // uint64(getHistoricalSummaryIndex()), + // uint64(getWithdrawalIndex()), + // blockRoot, + // slotRoot, + // timestampRoot, + // executionPayloadRoot + // ); + // } + // } } diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index bc553243c..581bcb18c 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -53,7 +53,6 @@ contract EigenPodManagerUnitTests is EigenLayerUnitTestSetup { address(eigenLayerProxyAdmin), abi.encodeWithSelector( EigenPodManager.initialize.selector, - IBeaconChainOracle(address(0)) /*beaconChainOracle*/, initialOwner, pauserRegistry, 0 /*initialPausedStatus*/ @@ -110,7 +109,6 @@ contract EigenPodManagerUnitTests_Initialization_Setters is EigenPodManagerUnitT function test_initialization() public { // Check max pods, beacon chain, owner, and pauser - assertEq(address(eigenPodManager.beaconChainOracle()), address(IBeaconChainOracle(address(0))), "Initialization: beacon chain oracle incorrect"); assertEq(eigenPodManager.owner(), initialOwner, "Initialization: owner incorrect"); assertEq(address(eigenPodManager.pauserRegistry()), address(pauserRegistry), "Initialization: pauser registry incorrect"); assertEq(eigenPodManager.paused(), 0, "Initialization: paused value not 0"); @@ -126,7 +124,6 @@ contract EigenPodManagerUnitTests_Initialization_Setters is EigenPodManagerUnitT function test_initialize_revert_alreadyInitialized() public { cheats.expectRevert("Initializable: contract is already initialized"); eigenPodManager.initialize( - IBeaconChainOracle(address(0)) /*beaconChainOracle*/, initialOwner, pauserRegistry, 0 /*initialPausedStatus*/); @@ -136,24 +133,24 @@ contract EigenPodManagerUnitTests_Initialization_Setters is EigenPodManagerUnitT Setters *******************************************************************************/ - function testFuzz_updateBeaconChainOracle_revert_notOwner(address notOwner) public filterFuzzedAddressInputs(notOwner) { - cheats.assume(notOwner != initialOwner); - cheats.prank(notOwner); - cheats.expectRevert("Ownable: caller is not the owner"); - eigenPodManager.updateBeaconChainOracle(IBeaconChainOracle(address(1))); - } - - function test_updateBeaconChainOracle() public { - // Set new beacon chain oracle - IBeaconChainOracle newBeaconChainOracle = IBeaconChainOracle(address(1)); - cheats.prank(initialOwner); - cheats.expectEmit(true, true, true, true); - emit BeaconOracleUpdated(address(newBeaconChainOracle)); - eigenPodManager.updateBeaconChainOracle(newBeaconChainOracle); - - // Check storage update - assertEq(address(eigenPodManager.beaconChainOracle()), address(newBeaconChainOracle), "Beacon chain oracle not updated"); - } + // function testFuzz_updateBeaconChainOracle_revert_notOwner(address notOwner) public filterFuzzedAddressInputs(notOwner) { + // cheats.assume(notOwner != initialOwner); + // cheats.prank(notOwner); + // cheats.expectRevert("Ownable: caller is not the owner"); + // eigenPodManager.updateBeaconChainOracle(IBeaconChainOracle(address(1))); + // } + + // function test_updateBeaconChainOracle() public { + // // Set new beacon chain oracle + // IBeaconChainOracle newBeaconChainOracle = IBeaconChainOracle(address(1)); + // cheats.prank(initialOwner); + // cheats.expectEmit(true, true, true, true); + // emit BeaconOracleUpdated(address(newBeaconChainOracle)); + // eigenPodManager.updateBeaconChainOracle(newBeaconChainOracle); + + // // Check storage update + // assertEq(address(eigenPodManager.beaconChainOracle()), address(newBeaconChainOracle), "Beacon chain oracle not updated"); + // } function test_setDenebForkTimestamp(uint64 denebForkTimestamp) public { cheats.assume(denebForkTimestamp != 0); diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 6af23d1bd..a34a6bb2c 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -31,8 +31,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { bool IS_DENEB = false; // Constants - // uint32 public constant WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; - uint64 public constant MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9; // uint64 public constant RESTAKED_BALANCE_OFFSET_GWEI = 75e7; uint64 public constant GOERLI_GENESIS_TIME = 1616508000; // uint64 public constant SECONDS_PER_SLOT = 12; @@ -54,7 +52,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { ethPOSDepositMock, delayedWithdrawalRouterMock, eigenPodManagerMock, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -104,7 +101,6 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests, IEigenPodEvents assertEq(address(eigenPod.ethPOS()), address(ethPOSDepositMock), "EthPOS incorrectly set"); assertEq(address(eigenPod.delayedWithdrawalRouter()), address(delayedWithdrawalRouterMock), "DelayedWithdrawalRouter incorrectly set"); assertEq(address(eigenPod.eigenPodManager()), address(eigenPodManagerMock), "EigenPodManager incorrectly set"); - assertEq(eigenPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(), MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Max restaked balance incorrectly set"); assertEq(eigenPod.GENESIS_TIME(), GOERLI_GENESIS_TIME, "Goerli genesis time incorrectly set"); } @@ -380,7 +376,6 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { ethPOSDepositMock, delayedWithdrawalRouterMock, eigenPodManagerMock, - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, GOERLI_GENESIS_TIME ); @@ -444,67 +439,67 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe ); } - function test_effectiveBalanceGreaterThan32ETH() public { - // Set JSON and params - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _setWithdrawalCredentialParams(); + // function test_effectiveBalanceGreaterThan32ETH() public { + // // Set JSON and params + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + // _setWithdrawalCredentialParams(); - // Check that restaked balance greater than 32 ETH - uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); - assertGt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance less than 32 ETH"); - - uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); - - // Verify withdrawal credentials - vm.expectEmit(true, true, true, true); - emit ValidatorRestaked(validatorIndex); - vm.expectEmit(true, true, true, true); - emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( - oracleTimestamp, - beaconStateRoot, - validatorIndex, - validatorFieldsProof, - validatorFields - ); - - // Checks - uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); - assertEq(restakedBalanceWei, uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * uint256(1e9), "Returned restaked balance gwei should be max"); - _assertWithdrawalCredentialsSet(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - } - - function test_effectiveBalanceLessThan32ETH() public { - // Set JSON and params - setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - _setWithdrawalCredentialParams(); + // // Check that restaked balance greater than 32 ETH + // uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); + // assertGt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance less than 32 ETH"); + + // uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); + + // // Verify withdrawal credentials + // vm.expectEmit(true, true, true, true); + // emit ValidatorRestaked(validatorIndex); + // vm.expectEmit(true, true, true, true); + // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); + // uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( + // oracleTimestamp, + // beaconStateRoot, + // validatorIndex, + // validatorFieldsProof, + // validatorFields + // ); + + // // Checks + // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); + // assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); + // assertEq(restakedBalanceWei, uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * uint256(1e9), "Returned restaked balance gwei should be max"); + // _assertWithdrawalCredentialsSet(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); + // } + + // function test_effectiveBalanceLessThan32ETH() public { + // // Set JSON and params + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); + // _setWithdrawalCredentialParams(); - // Check that restaked balance less than 32 ETH - uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); - assertLt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance greater than 32 ETH"); - - uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); - - // Verify withdrawal credentials - vm.expectEmit(true, true, true, true); - emit ValidatorRestaked(validatorIndex); - vm.expectEmit(true, true, true, true); - emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, effectiveBalanceGwei); - uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( - oracleTimestamp, - beaconStateRoot, - validatorIndex, - validatorFieldsProof, - validatorFields - ); - - // Checks - uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); - assertEq(restakedBalanceWei, uint256(effectiveBalanceGwei) * uint256(1e9), "Returned restaked balance gwei incorrect"); - _assertWithdrawalCredentialsSet(effectiveBalanceGwei); - } + // // Check that restaked balance less than 32 ETH + // uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); + // assertLt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance greater than 32 ETH"); + + // uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); + + // // Verify withdrawal credentials + // vm.expectEmit(true, true, true, true); + // emit ValidatorRestaked(validatorIndex); + // vm.expectEmit(true, true, true, true); + // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, effectiveBalanceGwei); + // uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( + // oracleTimestamp, + // beaconStateRoot, + // validatorIndex, + // validatorFieldsProof, + // validatorFields + // ); + + // // Checks + // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); + // assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); + // assertEq(restakedBalanceWei, uint256(effectiveBalanceGwei) * uint256(1e9), "Returned restaked balance gwei incorrect"); + // _assertWithdrawalCredentialsSet(effectiveBalanceGwei); + // } function _assertWithdrawalCredentialsSet(uint256 restakedBalanceGwei) internal { IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); @@ -539,171 +534,171 @@ contract EigenPodUnitTests_VerifyBalanceUpdateTests is EigenPodHarnessSetup, Pro bytes validatorFieldsProof; bytes32[] validatorFields; - function testFuzz_revert_oracleTimestampStale(uint64 oracleFuzzTimestamp, uint64 mostRecentBalanceUpdateTimestamp) public { - // Constain inputs and set proof file - cheats.assume(oracleFuzzTimestamp < mostRecentBalanceUpdateTimestamp); - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // function testFuzz_revert_oracleTimestampStale(uint64 oracleFuzzTimestamp, uint64 mostRecentBalanceUpdateTimestamp) public { + // // Constain inputs and set proof file + // cheats.assume(oracleFuzzTimestamp < mostRecentBalanceUpdateTimestamp); + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // Get validator fields and balance update root - validatorFields = getValidatorFields(); - validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); - - // Balance update reversion - cheats.expectRevert( - "EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp" - ); - eigenPodHarness.verifyBalanceUpdate( - oracleFuzzTimestamp, - 0, - bytes32(0), - validatorFieldsProof, - validatorFields, - mostRecentBalanceUpdateTimestamp - ); - } - - function test_revert_validatorInactive() public { - // Set proof file - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // Set proof params - _setBalanceUpdateParams(); - - // Set validator status to inactive - eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); - - // Balance update reversion - cheats.expectRevert( - "EigenPod.verifyBalanceUpdate: Validator not active" - ); - eigenPodHarness.verifyBalanceUpdate( - oracleTimestamp, - validatorIndex, - beaconStateRoot, - validatorFieldsProof, - validatorFields, - 0 // Most recent balance update timestamp set to 0 - ); - } + // // Get validator fields and balance update root + // validatorFields = getValidatorFields(); + // validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); + + // // Balance update reversion + // cheats.expectRevert( + // "EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp" + // ); + // eigenPodHarness.verifyBalanceUpdate( + // oracleFuzzTimestamp, + // 0, + // bytes32(0), + // validatorFieldsProof, + // validatorFields, + // mostRecentBalanceUpdateTimestamp + // ); + // } + + // function test_revert_validatorInactive() public { + // // Set proof file + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + + // // Set proof params + // _setBalanceUpdateParams(); + + // // Set validator status to inactive + // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); + + // // Balance update reversion + // cheats.expectRevert( + // "EigenPod.verifyBalanceUpdate: Validator not active" + // ); + // eigenPodHarness.verifyBalanceUpdate( + // oracleTimestamp, + // validatorIndex, + // beaconStateRoot, + // validatorFieldsProof, + // validatorFields, + // 0 // Most recent balance update timestamp set to 0 + // ); + // } /** * Regression test for a bug that allowed balance updates to be made for withdrawn validators. Thus * the validator's balance could be maliciously proven to be 0 before the validator themselves are * able to prove their withdrawal. */ - function test_revert_balanceUpdateAfterWithdrawableEpoch() external { - // Set Json proof - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // function test_revert_balanceUpdateAfterWithdrawableEpoch() external { + // // Set Json proof + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // Set proof params - _setBalanceUpdateParams(); + // // Set proof params + // _setBalanceUpdateParams(); - // Set effective balance and withdrawable epoch - validatorFields[2] = bytes32(uint256(0)); // per consensus spec, slot 2 is effective balance - validatorFields[7] = bytes32(uint256(0)); // per consensus spec, slot 7 is withdrawable epoch == 0 + // // Set effective balance and withdrawable epoch + // validatorFields[2] = bytes32(uint256(0)); // per consensus spec, slot 2 is effective balance + // validatorFields[7] = bytes32(uint256(0)); // per consensus spec, slot 7 is withdrawable epoch == 0 - console.log("withdrawable epoch: ", validatorFields.getWithdrawableEpoch()); - // Expect revert on balance update - cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: validator is withdrawable but has not withdrawn")); - eigenPodHarness.verifyBalanceUpdate(oracleTimestamp, validatorIndex, beaconStateRoot, validatorFieldsProof, validatorFields, 0); - } + // console.log("withdrawable epoch: ", validatorFields.getWithdrawableEpoch()); + // // Expect revert on balance update + // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: validator is withdrawable but has not withdrawn")); + // eigenPodHarness.verifyBalanceUpdate(oracleTimestamp, validatorIndex, beaconStateRoot, validatorFieldsProof, validatorFields, 0); + // } /// @notice Rest of tests assume beacon chain proofs are correct; Now we update the validator's balance ///@notice Balance of validator is >= 32e9 - function test_positiveSharesDelta() public { - // Set JSON - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // Set proof params - _setBalanceUpdateParams(); - - // Verify balance update - vm.expectEmit(true, true, true, true); - emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - oracleTimestamp, - validatorIndex, - beaconStateRoot, - validatorFieldsProof, - validatorFields, - 0 // Most recent balance update timestamp set to 0 - ); - - // Checks - IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - assertGt(sharesDeltaGwei, 0, "Shares delta should be positive"); - assertEq(sharesDeltaGwei, int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)), "Shares delta should be equal to restaked balance"); - } + // function test_positiveSharesDelta() public { + // // Set JSON + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + + // // Set proof params + // _setBalanceUpdateParams(); + + // // Verify balance update + // vm.expectEmit(true, true, true, true); + // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); + // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( + // oracleTimestamp, + // validatorIndex, + // beaconStateRoot, + // validatorFieldsProof, + // validatorFields, + // 0 // Most recent balance update timestamp set to 0 + // ); + + // // Checks + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); + // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); + // assertGt(sharesDeltaGwei, 0, "Shares delta should be positive"); + // assertEq(sharesDeltaGwei, int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)), "Shares delta should be equal to restaked balance"); + // } - function test_negativeSharesDelta() public { - // Set JSON - setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); - - // Set proof params - _setBalanceUpdateParams(); - uint64 newValidatorBalance = validatorFields.getEffectiveBalanceGwei(); - - // Set balance of validator to max ETH - eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - - // Verify balance update - int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - oracleTimestamp, - validatorIndex, - beaconStateRoot, - validatorFieldsProof, - validatorFields, - 0 // Most recent balance update timestamp set to 0 - ); - - // Checks - IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei should be max"); - assertLt(sharesDeltaGwei, 0, "Shares delta should be negative"); - int256 expectedSharesDiff = int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - assertEq(sharesDeltaGwei, expectedSharesDiff, "Shares delta should be equal to restaked balance"); - } - - function test_zeroSharesDelta() public { - // Set JSON - setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // Set proof params - _setBalanceUpdateParams(); - - // Set previous restaked balance to max restaked balance - eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - - // Verify balance update - int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - oracleTimestamp, - validatorIndex, - beaconStateRoot, - validatorFieldsProof, - validatorFields, - 0 // Most recent balance update timestamp set to 0 - ); - - // Checks - assertEq(sharesDeltaGwei, 0, "Shares delta should be 0"); - } - - function _setBalanceUpdateParams() internal { - // Set validator index, beacon state root, balance update proof, and validator fields - validatorIndex = uint40(getValidatorIndex()); - beaconStateRoot = getBeaconStateRoot(); - validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); - validatorFields = getValidatorFields(); - - // Get an oracle timestamp - cheats.warp(GOERLI_GENESIS_TIME + 1 days); - oracleTimestamp = uint64(block.timestamp); - - // Set validator status to active - eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.ACTIVE); - } + // function test_negativeSharesDelta() public { + // // Set JSON + // setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); + + // // Set proof params + // _setBalanceUpdateParams(); + // uint64 newValidatorBalance = validatorFields.getEffectiveBalanceGwei(); + + // // Set balance of validator to max ETH + // eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); + + // // Verify balance update + // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( + // oracleTimestamp, + // validatorIndex, + // beaconStateRoot, + // validatorFieldsProof, + // validatorFields, + // 0 // Most recent balance update timestamp set to 0 + // ); + + // // Checks + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); + // assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei should be max"); + // assertLt(sharesDeltaGwei, 0, "Shares delta should be negative"); + // int256 expectedSharesDiff = int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); + // assertEq(sharesDeltaGwei, expectedSharesDiff, "Shares delta should be equal to restaked balance"); + // } + + // function test_zeroSharesDelta() public { + // // Set JSON + // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + + // // Set proof params + // _setBalanceUpdateParams(); + + // // Set previous restaked balance to max restaked balance + // eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); + + // // Verify balance update + // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( + // oracleTimestamp, + // validatorIndex, + // beaconStateRoot, + // validatorFieldsProof, + // validatorFields, + // 0 // Most recent balance update timestamp set to 0 + // ); + + // // Checks + // assertEq(sharesDeltaGwei, 0, "Shares delta should be 0"); + // } + + // function _setBalanceUpdateParams() internal { + // // Set validator index, beacon state root, balance update proof, and validator fields + // validatorIndex = uint40(getValidatorIndex()); + // beaconStateRoot = getBeaconStateRoot(); + // validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); + // validatorFields = getValidatorFields(); + + // // Get an oracle timestamp + // cheats.warp(GOERLI_GENESIS_TIME + 1 days); + // oracleTimestamp = uint64(block.timestamp); + + // // Set validator status to active + // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.ACTIVE); + // } } contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing, IEigenPodEvents { @@ -711,362 +706,362 @@ contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing // Params to process withdrawal bytes32 beaconStateRoot; - BeaconChainProofs.WithdrawalProof withdrawalToProve; + // BeaconChainProofs.WithdrawalProof withdrawalToProve; bytes validatorFieldsProof; bytes32[] validatorFields; bytes32[] withdrawalFields; // Most recent withdrawal timestamp incremented when withdrawal processed before restaking OR when staking activated - function test_verifyAndProcessWithdrawal_revert_staleProof() public hasNotRestaked { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Set timestamp to after withdrawal timestamp - uint64 timestampOfWithdrawal = Endian.fromLittleEndianUint64(withdrawalToProve.timestampRoot); - uint256 newTimestamp = timestampOfWithdrawal + 2500; - cheats.warp(newTimestamp); - - // Activate restaking, setting `mostRecentWithdrawalTimestamp` - eigenPodHarness.activateRestaking(); - - // Expect revert - cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - } - - function test_verifyAndProcessWithdrawal_revert_statusInactive() public { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Set status to inactive - eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); - - // Expect revert - cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: Validator never proven to have withdrawal credentials pointed to this contract"); - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - } - - function test_verifyAndProcessWithdrawal_withdrawalAlreadyProcessed() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Process withdrawal - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Attempt to process again - cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp"); - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - } - - function test_verifyAndProcessWithdrawal_excess() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Process withdrawal - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Verify storage - bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - } + // function test_verifyAndProcessWithdrawal_revert_staleProof() public hasNotRestaked { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Set timestamp to after withdrawal timestamp + // uint64 timestampOfWithdrawal = Endian.fromLittleEndianUint64(withdrawalToProve.timestampRoot); + // uint256 newTimestamp = timestampOfWithdrawal + 2500; + // cheats.warp(newTimestamp); + + // // Activate restaking, setting `mostRecentWithdrawalTimestamp` + // eigenPodHarness.activateRestaking(); + + // // Expect revert + // cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + // } + + // function test_verifyAndProcessWithdrawal_revert_statusInactive() public { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Set status to inactive + // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); + + // // Expect revert + // cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: Validator never proven to have withdrawal credentials pointed to this contract"); + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + // } + + // function test_verifyAndProcessWithdrawal_withdrawalAlreadyProcessed() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Process withdrawal + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Attempt to process again + // cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp"); + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + // } + + // function test_verifyAndProcessWithdrawal_excess() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Process withdrawal + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Verify storage + // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); + // } // regression test for off-by-one error - function test_verifyAndProcessWithdrawal_atLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // set the `mostRecentWithdrawalTimestamp` to be equal to the withdrawal timestamp - eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp); - - // Process withdrawal - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Verify storage - bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - } - - function test_revert_verifyAndProcessWithdrawal_beforeLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // set the `mostRecentWithdrawalTimestamp` to just after the withdrawal timestamp - eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp + 1); - - // Process withdrawal, expect revert - cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); - eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - } + // function test_verifyAndProcessWithdrawal_atLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // // set the `mostRecentWithdrawalTimestamp` to be equal to the withdrawal timestamp + // eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp); + + // // Process withdrawal + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Verify storage + // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); + // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); + // } + + // function test_revert_verifyAndProcessWithdrawal_beforeLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // // set the `mostRecentWithdrawalTimestamp` to just after the withdrawal timestamp + // eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp + 1); + + // // Process withdrawal, expect revert + // cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); + // eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + // } /// @notice Tests processing a full withdrawal > MAX_RESTAKED_GWEI_PER_VALIDATOR - function test_processFullWithdrawal_excess32ETH() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Get params to check against - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - uint40 validatorIndex = uint40(getValidatorIndex()); - uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - assertGt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); - - // Process full withdrawal - vm.expectEmit(true, true, true, true); - emit FullWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); - IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Storage checks in _verifyAndProcessWithdrawal - bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // Checks from _processFullWithdrawal - assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Incorrect withdrawable restaked execution layer gwei"); - // Excess withdrawal amount is diff between restaked balance and total withdrawal amount - uint64 excessWithdrawalAmount = withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - assertEq(vw.amountToSendGwei, excessWithdrawalAmount, "Amount to send via router is not correct"); - assertEq(vw.sharesDeltaGwei, 0, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max + // function test_processFullWithdrawal_excess32ETH() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Get params to check against + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // uint40 validatorIndex = uint40(getValidatorIndex()); + // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); + // assertGt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); + + // // Process full withdrawal + // vm.expectEmit(true, true, true, true); + // emit FullWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); + // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Storage checks in _verifyAndProcessWithdrawal + // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); + // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); + + // // Checks from _processFullWithdrawal + // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Incorrect withdrawable restaked execution layer gwei"); + // // Excess withdrawal amount is diff between restaked balance and total withdrawal amount + // uint64 excessWithdrawalAmount = withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; + // assertEq(vw.amountToSendGwei, excessWithdrawalAmount, "Amount to send via router is not correct"); + // assertEq(vw.sharesDeltaGwei, 0, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max - // ValidatorInfo storage update checks - IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - } - - function test_processFullWithdrawal_lessThan32ETH() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); - _setWithdrawalProofParams(); - - // Get params to check against - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - assertLt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); - - // Process full withdrawal - IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Storage checks in _verifyAndProcessWithdrawal - bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // Checks from _processFullWithdrawal - assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmountGwei, "Incorrect withdrawable restaked execution layer gwei"); - // Excess withdrawal amount should be 0 since balance is < MAX - assertEq(vw.amountToSendGwei, 0, "Amount to send via router is not correct"); - int256 expectedSharesDiff = int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - assertEq(vw.sharesDeltaGwei, expectedSharesDiff, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max + // // ValidatorInfo storage update checks + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); + // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); + // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); + // } + + // function test_processFullWithdrawal_lessThan32ETH() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); + // _setWithdrawalProofParams(); + + // // Get params to check against + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); + // assertLt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); + + // // Process full withdrawal + // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Storage checks in _verifyAndProcessWithdrawal + // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); + // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); + + // // Checks from _processFullWithdrawal + // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmountGwei, "Incorrect withdrawable restaked execution layer gwei"); + // // Excess withdrawal amount should be 0 since balance is < MAX + // assertEq(vw.amountToSendGwei, 0, "Amount to send via router is not correct"); + // int256 expectedSharesDiff = int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); + // assertEq(vw.sharesDeltaGwei, expectedSharesDiff, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max - // ValidatorInfo storage update checks - IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - } - - function test_processPartialWithdrawal() public setWithdrawalCredentialsExcess { - // Set JSON & params - setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - _setWithdrawalProofParams(); - - // Get params to check against - uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - uint40 validatorIndex = uint40(getValidatorIndex()); - uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); + // // ValidatorInfo storage update checks + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); + // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); + // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); + // } + + // function test_processPartialWithdrawal() public setWithdrawalCredentialsExcess { + // // Set JSON & params + // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); + // _setWithdrawalProofParams(); + + // // Get params to check against + // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); + // uint40 validatorIndex = uint40(getValidatorIndex()); + // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - // Assert that partial withdrawal code path will be tested - assertLt(withdrawalToProve.getWithdrawalEpoch(), validatorFields.getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); - - // Process partial withdrawal - vm.expectEmit(true, true, true, true); - emit PartialWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); - IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - beaconStateRoot, - withdrawalToProve, - validatorFieldsProof, - validatorFields, - withdrawalFields - ); - - // Storage checks in _verifyAndProcessWithdrawal - bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // Checks from _processPartialWithdrawal - assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), withdrawalAmountGwei, "Incorrect partial withdrawal amount"); - assertEq(vw.amountToSendGwei, withdrawalAmountGwei, "Amount to send via router is not correct"); - assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); - - // Assert validator still has same restaked balance and status - IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.ACTIVE), "Validator status should be active"); - assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - } - - function testFuzz_processFullWithdrawal(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { - // Format validatorInfo struct - IEigenPod.ValidatorInfo memory validatorInfo = IEigenPod.ValidatorInfo({ - validatorIndex: 0, - restakedBalanceGwei: restakedAmount, - mostRecentBalanceUpdateTimestamp: 0, - status: IEigenPod.VALIDATOR_STATUS.ACTIVE - }); - - // Since we're withdrawing using an ACTIVE validator, ensure we have - // a validator count to decrement - uint activeValidatorCountBefore = 1 + eigenPodHarness.getActiveValidatorCount(); - eigenPodHarness.setActiveValidatorCount(activeValidatorCountBefore); + // // Assert that partial withdrawal code path will be tested + // assertLt(withdrawalToProve.getWithdrawalEpoch(), validatorFields.getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); + + // // Process partial withdrawal + // vm.expectEmit(true, true, true, true); + // emit PartialWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); + // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( + // beaconStateRoot, + // withdrawalToProve, + // validatorFieldsProof, + // validatorFields, + // withdrawalFields + // ); + + // // Storage checks in _verifyAndProcessWithdrawal + // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); + // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); + + // // Checks from _processPartialWithdrawal + // assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), withdrawalAmountGwei, "Incorrect partial withdrawal amount"); + // assertEq(vw.amountToSendGwei, withdrawalAmountGwei, "Amount to send via router is not correct"); + // assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); + + // // Assert validator still has same restaked balance and status + // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); + // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.ACTIVE), "Validator status should be active"); + // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); + // } + + // function testFuzz_processFullWithdrawal(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { + // // Format validatorInfo struct + // IEigenPod.ValidatorInfo memory validatorInfo = IEigenPod.ValidatorInfo({ + // validatorIndex: 0, + // restakedBalanceGwei: restakedAmount, + // mostRecentBalanceUpdateTimestamp: 0, + // status: IEigenPod.VALIDATOR_STATUS.ACTIVE + // }); + + // // Since we're withdrawing using an ACTIVE validator, ensure we have + // // a validator count to decrement + // uint activeValidatorCountBefore = 1 + eigenPodHarness.getActiveValidatorCount(); + // eigenPodHarness.setActiveValidatorCount(activeValidatorCountBefore); - // Process full withdrawal. - IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processFullWithdrawal(0, pubkeyHash, 0, podOwner, withdrawalAmount, validatorInfo); - - // Validate that our activeValidatorCount decreased - uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - assertEq(activeValidatorCountAfter, activeValidatorCountBefore - 1, "active validator count should decrease when withdrawing active validator"); - - // Get expected amounts based on withdrawalAmount - uint64 amountETHToQueue; - uint64 amountETHToSend; - if (withdrawalAmount > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR){ - amountETHToQueue = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - amountETHToSend = withdrawalAmount - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - } else { - amountETHToQueue = withdrawalAmount; - amountETHToSend = 0; - } - - // Check invariant-> amountToQueue + amountToSend = withdrawalAmount - assertEq(vw.amountToSendGwei + eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmount, "Amount to queue and send must add up to total withdrawal amount"); - - // Check amount to queue and send - assertEq(vw.amountToSendGwei, amountETHToSend, "Amount to queue is not correct"); - assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), amountETHToQueue, "Incorrect withdrawable restaked execution layer gwei"); - - // Check shares delta - int256 expectedSharesDelta = int256(uint256(amountETHToQueue)) - int256(uint256(restakedAmount)); - assertEq(vw.sharesDeltaGwei, expectedSharesDelta, "Shares delta not correct"); - - // Storage checks - IEigenPod.ValidatorInfo memory validatorInfoAfter = eigenPodHarness.validatorPubkeyHashToInfo(pubkeyHash); - assertEq(uint8(validatorInfoAfter.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - assertEq(validatorInfoAfter.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - } - - function testFuzz_processFullWithdrawal_lessMaxRestakedBalance(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { - withdrawalAmount = uint64(bound(withdrawalAmount, 0, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - testFuzz_processFullWithdrawal(pubkeyHash, restakedAmount, withdrawalAmount); - } + // // Process full withdrawal. + // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processFullWithdrawal(0, pubkeyHash, 0, podOwner, withdrawalAmount, validatorInfo); + + // // Validate that our activeValidatorCount decreased + // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); + // assertEq(activeValidatorCountAfter, activeValidatorCountBefore - 1, "active validator count should decrease when withdrawing active validator"); + + // // Get expected amounts based on withdrawalAmount + // uint64 amountETHToQueue; + // uint64 amountETHToSend; + // if (withdrawalAmount > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR){ + // amountETHToQueue = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; + // amountETHToSend = withdrawalAmount - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; + // } else { + // amountETHToQueue = withdrawalAmount; + // amountETHToSend = 0; + // } + + // // Check invariant-> amountToQueue + amountToSend = withdrawalAmount + // assertEq(vw.amountToSendGwei + eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmount, "Amount to queue and send must add up to total withdrawal amount"); + + // // Check amount to queue and send + // assertEq(vw.amountToSendGwei, amountETHToSend, "Amount to queue is not correct"); + // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), amountETHToQueue, "Incorrect withdrawable restaked execution layer gwei"); + + // // Check shares delta + // int256 expectedSharesDelta = int256(uint256(amountETHToQueue)) - int256(uint256(restakedAmount)); + // assertEq(vw.sharesDeltaGwei, expectedSharesDelta, "Shares delta not correct"); + + // // Storage checks + // IEigenPod.ValidatorInfo memory validatorInfoAfter = eigenPodHarness.validatorPubkeyHashToInfo(pubkeyHash); + // assertEq(uint8(validatorInfoAfter.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); + // assertEq(validatorInfoAfter.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); + // } + + // function testFuzz_processFullWithdrawal_lessMaxRestakedBalance(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { + // withdrawalAmount = uint64(bound(withdrawalAmount, 0, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); + // testFuzz_processFullWithdrawal(pubkeyHash, restakedAmount, withdrawalAmount); + // } - function testFuzz_processPartialWithdrawal( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address recipient, - uint64 partialWithdrawalAmountGwei - ) public { - IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processPartialWithdrawal(validatorIndex, withdrawalTimestamp, recipient, partialWithdrawalAmountGwei); - - // Checks - assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), partialWithdrawalAmountGwei, "Incorrect partial withdrawal amount"); - assertEq(vw.amountToSendGwei, partialWithdrawalAmountGwei, "Amount to send via router is not correct"); - assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); - } - - function _setWithdrawalProofParams() internal { - // Set validator index, beacon state root, balance update proof, and validator fields - beaconStateRoot = getBeaconStateRoot(); - validatorFields = getValidatorFields(); - validatorFieldsProof = abi.encodePacked(getValidatorProof()); - withdrawalToProve = _getWithdrawalProof(); - withdrawalFields = getWithdrawalFields(); - } + // function testFuzz_processPartialWithdrawal( + // uint40 validatorIndex, + // uint64 withdrawalTimestamp, + // address recipient, + // uint64 partialWithdrawalAmountGwei + // ) public { + // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processPartialWithdrawal(validatorIndex, withdrawalTimestamp, recipient, partialWithdrawalAmountGwei); + + // // Checks + // assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), partialWithdrawalAmountGwei, "Incorrect partial withdrawal amount"); + // assertEq(vw.amountToSendGwei, partialWithdrawalAmountGwei, "Amount to send via router is not correct"); + // assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); + // } + + // function _setWithdrawalProofParams() internal { + // // Set validator index, beacon state root, balance update proof, and validator fields + // beaconStateRoot = getBeaconStateRoot(); + // validatorFields = getValidatorFields(); + // validatorFieldsProof = abi.encodePacked(getValidatorProof()); + // withdrawalToProve = _getWithdrawalProof(); + // withdrawalFields = getWithdrawalFields(); + // } /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - { - bytes32 blockRoot = getBlockRoot(); - bytes32 slotRoot = getSlotRoot(); - bytes32 timestampRoot = getTimestampRoot(); - bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); - bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); - return - BeaconChainProofs.WithdrawalProof( - abi.encodePacked(withdrawalProof), - abi.encodePacked(getSlotProof()), - abi.encodePacked(getExecutionPayloadProof()), - abi.encodePacked(timestampProof), - abi.encodePacked(getHistoricalSummaryProof()), - uint64(getBlockRootIndex()), - uint64(getHistoricalSummaryIndex()), - uint64(getWithdrawalIndex()), - blockRoot, - slotRoot, - timestampRoot, - executionPayloadRoot - ); - } - } + // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { + // { + // bytes32 blockRoot = getBlockRoot(); + // bytes32 slotRoot = getSlotRoot(); + // bytes32 timestampRoot = getTimestampRoot(); + // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); + // bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); + // bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); + // return + // BeaconChainProofs.WithdrawalProof( + // abi.encodePacked(withdrawalProof), + // abi.encodePacked(getSlotProof()), + // abi.encodePacked(getExecutionPayloadProof()), + // abi.encodePacked(timestampProof), + // abi.encodePacked(getHistoricalSummaryProof()), + // uint64(getBlockRootIndex()), + // uint64(getHistoricalSummaryIndex()), + // uint64(getWithdrawalIndex()), + // blockRoot, + // slotRoot, + // timestampRoot, + // executionPayloadRoot + // ); + // } + // } ///@notice Effective balance is > 32 ETH modifier setWithdrawalCredentialsExcess() { From f74477e453a4cda7805d72bcecfbdf72b23f6b80 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 23 Apr 2024 14:41:21 +0000 Subject: [PATCH 03/85] feat: adjust verifyStaleBalance to allow anyone to start a checkpoint * removes staleness concept from pod and manager state * clean: clean up start checkpoint logic * clean: remove comments * clean: remove outdated comment and rename proofs method * fix: remove unused variable and deprecate another --- src/contracts/interfaces/IEigenPodManager.sol | 12 -- src/contracts/libraries/BeaconChainProofs.sol | 2 +- src/contracts/pods/EigenPod.sol | 169 +++++++----------- src/contracts/pods/EigenPodManager.sol | 28 --- src/contracts/pods/EigenPodManagerStorage.sol | 5 +- src/contracts/pods/EigenPodStorage.sol | 7 +- 6 files changed, 73 insertions(+), 150 deletions(-) diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index 4080563c0..cc8a81b68 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -136,18 +136,6 @@ interface IEigenPodManager is IPausable { /// will revert. function getParentBlockRoot(uint64 timestamp) external view returns (bytes32); - /** - * @dev Changes the `podOwner's` stale validator count by `countDelta`. The stale validator - * count can be used as an additional weighting mechanism to determine a staker or operator's shares. - * @param podOwner the pod owner whose stale validator count is being updated - * @param countDelta the change in `podOwner's` stale validator count as a signed integer - * @dev Callable only by the `podOwner's` EigenPod contract - */ - function updateStaleValidatorCount( - address podOwner, - int256 countDelta - ) external; - /** * @notice the deneb hard fork timestamp used to determine which proof path to use for proving a withdrawal */ diff --git a/src/contracts/libraries/BeaconChainProofs.sol b/src/contracts/libraries/BeaconChainProofs.sol index d2fdec4ef..68706ad47 100644 --- a/src/contracts/libraries/BeaconChainProofs.sol +++ b/src/contracts/libraries/BeaconChainProofs.sol @@ -267,7 +267,7 @@ library BeaconChainProofs { /** * @dev Returns true IFF the validator is marked slashed */ - function getSlashStatus(bytes32[] memory validatorFields) internal pure returns (bool) { + function isValidatorSlashed(bytes32[] memory validatorFields) internal pure returns (bool) { return validatorFields[VALIDATOR_SLASHED_INDEX] != 0; } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 7ef862060..938f85612 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -166,29 +166,7 @@ contract EigenPod is onlyWhenNotPaused(PAUSED_START_CHECKPOINT) afterRestaking(uint64(block.timestamp)) /// TODO - this is the wrong condition { - require( - currentCheckpointTimestamp == 0, - "EigenPod.startCheckpoint: must finish previous checkpoint before starting another" - ); - - // Snapshot pod balance at the start of the checkpoint. Once the checkpoint is finalized, - // this amount will be added to the total validator balance delta and credited as shares. - uint256 podBalanceWei = - address(this).balance - - nonBeaconChainETHBalanceWei - - (withdrawableRestakedExecutionLayerGwei * GWEI_TO_WEI); - - Checkpoint memory checkpoint = Checkpoint({ - beaconBlockRoot: eigenPodManager.getParentBlockRoot(uint64(block.timestamp)), - beaconStateRoot: bytes32(0), - podBalanceGwei: podBalanceWei / GWEI_TO_WEI, - balanceDeltasGwei: 0, - proofsRemaining: activeValidatorCount - }); - - // Place checkpoint in storage - currentCheckpointTimestamp = uint64(block.timestamp); - _updateCheckpoint(checkpoint); + _startCheckpoint(); } /** @@ -231,7 +209,6 @@ contract EigenPod is } // Process each checkpoint proof submitted - int256 totalStaleValidatorsProven; for (uint256 i = 0; i < proofs.length; i++) { // Process a checkpoint proof for a validator. @@ -241,7 +218,7 @@ contract EigenPod is // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. // The assumption is that if this is the case, any withdrawn ETH was already in // the pod when `startCheckpoint` was originally called. - (int256 balanceDeltaGwei, bool noLongerStale) = _verifyCheckpointProof({ + int256 balanceDeltaGwei = _verifyCheckpointProof({ beaconTimestamp: beaconTimestamp, beaconStateRoot: checkpoint.beaconStateRoot, proof: proofs[i] @@ -249,18 +226,10 @@ contract EigenPod is checkpoint.proofsRemaining--; checkpoint.balanceDeltasGwei += balanceDeltaGwei; - - if (noLongerStale) { - totalStaleValidatorsProven++; - } } // Update and/or finalize the checkpoint _updateCheckpoint(checkpoint); - - if (totalStaleValidatorsProven != 0) { - eigenPodManager.updateStaleValidatorCount(podOwner, totalStaleValidatorsProven); - } } /** @@ -294,11 +263,7 @@ contract EigenPod is (validatorFieldsProofs.length == validatorFields.length), "EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length" ); - - // TODO - is == valid? - // I think YES, because we enforce no exit epoch is set - // However, we could also do strictly greater than if we want to be safe. - // TODO pt 2 - what about sub 12 on checkpointTimestamp? + require( beaconTimestamp > lastFinalizedCheckpoint && beaconTimestamp > currentCheckpointTimestamp, "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" @@ -328,13 +293,13 @@ contract EigenPod is /** * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely - * checkpoint proofs since being slashed. If successful, this increases the pod owner's `staleValidatorCount` - * in the `EigenPodManager`. Stale validators can be restored by proving their balance in a checkpoint via - * `startCheckpoint` and `verifyCheckpointProofs`. + * checkpoint proofs since being slashed. If successful, this allows the caller to start a checkpoint. + * @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed! + * (See `_startCheckpoint` for details) * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. * @param stateRootProof proves a beacon state root against a beacon block root - * @param proofs the fields of the beacon chain "Validator" container, along with a merkle proof against + * @param proof the fields of the beacon chain "Validator" container, along with a merkle proof against * the beacon state root. See the consensus specs for more details: * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator * @@ -342,71 +307,59 @@ contract EigenPod is * - `beaconTimestamp` MUST NOT fall within `STALENESS_GRACE_PERIOD` seconds of `block.timestamp` * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` * - Validator MUST be in `ACTIVE` status in the pod - * - Validator MUST NOT already be marked stale * - Validator MUST be slashed on the beacon chain */ - function verifyStaleBalances( + function verifyStaleBalance( uint64 beaconTimestamp, BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.ValidatorProof[] calldata proofs + BeaconChainProofs.ValidatorProof calldata proof ) external onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) - { + { require( beaconTimestamp + STALENESS_GRACE_PERIOD < block.timestamp, "EigenPod.verifyStaleBalance: staleness grace period not elapsed" ); - // Process each staleness proof - for (uint256 i = 0; i < proofs.length; i++) { - bytes32 validatorPubkey = proofs[i].validatorFields.getPubkeyHash(); - ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkey]; - - // Validator must be eligible for a staleness proof - require( - beaconTimestamp > validatorInfo.mostRecentBalanceUpdateTimestamp + TIME_TILL_STALE_BALANCE, - "EigenPod.verifyStaleBalance: validator balance is not stale yet" - ); - - // Validator must be checkpoint-able - require( - validatorInfo.status == VALIDATOR_STATUS.ACTIVE, - "EigenPod.verifyStaleBalance: validator is not active" - ); + bytes32 validatorPubkey = proof.validatorFields.getPubkeyHash(); + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkey]; - // Validator should not already be stale - require( - !isValidatorStale[validatorPubkey], - "EigenPod.verifyStaleBalance: validator already marked stale" - ); + // Validator must be eligible for a staleness proof + require( + beaconTimestamp > validatorInfo.mostRecentBalanceUpdateTimestamp + TIME_TILL_STALE_BALANCE, + "EigenPod.verifyStaleBalance: validator balance is not stale yet" + ); - // Validator must be slashed on the beacon chain - require( - proofs[i].validatorFields.getSlashStatus() == true, - "EigenPod.verifyStaleBalance: validator must be slashed to be marked stale" - ); + // Validator must be checkpoint-able + require( + validatorInfo.status == VALIDATOR_STATUS.ACTIVE, + "EigenPod.verifyStaleBalance: validator is not active" + ); - // Verify `beaconStateRoot` against beacon block root - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof - }); + // Validator must be slashed on the beacon chain + require( + proof.validatorFields.isValidatorSlashed(), + "EigenPod.verifyStaleBalance: validator must be slashed to be marked stale" + ); - // Verify Validator container proof against `beaconStateRoot` - BeaconChainProofs.verifyValidatorFields({ - beaconStateRoot: stateRootProof.beaconStateRoot, - validatorFields: proofs[i].validatorFields, - validatorFieldsProof: proofs[i].proof, - validatorIndex: uint40(validatorInfo.validatorIndex) - }); + // Verify `beaconStateRoot` against beacon block root + BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ + latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), + beaconStateRoot: stateRootProof.beaconStateRoot, + stateRootProof: stateRootProof.proof + }); - isValidatorStale[validatorPubkey] = true; - } + // Verify Validator container proof against `beaconStateRoot` + BeaconChainProofs.verifyValidatorFields({ + beaconStateRoot: stateRootProof.beaconStateRoot, + validatorFields: proof.validatorFields, + validatorFieldsProof: proof.proof, + validatorIndex: uint40(validatorInfo.validatorIndex) + }); - // Increment stale validator count by one for each successful proof - eigenPodManager.updateStaleValidatorCount(podOwner, int256(proofs.length)); + // Validator verified to be stale - start a checkpoint + _startCheckpoint(); } /// @notice Called by the pod owner to withdraw the nonBeaconChainETHBalanceWei @@ -560,7 +513,7 @@ contract EigenPod is uint64 beaconTimestamp, bytes32 beaconStateRoot, BeaconChainProofs.BalanceProof calldata proof - ) internal returns (int256 balanceDeltaGwei, bool noLongerStale) { + ) internal returns (int256 balanceDeltaGwei) { ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proof.pubkeyHash]; require( @@ -606,17 +559,33 @@ contract EigenPod is }); } - // If the validator was marked stale and this proof is younger than - // `TIME_TILL_STALE_BALANCE`, the validator is no longer stale. - if ( - beaconTimestamp + TIME_TILL_STALE_BALANCE >= block.timestamp && - isValidatorStale[proof.pubkeyHash] - ) { - isValidatorStale[proof.pubkeyHash] = false; - noLongerStale = true; - } + return balanceDeltaGwei; + } + + function _startCheckpoint() internal { + require( + currentCheckpointTimestamp == 0, + "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" + ); + + // Snapshot pod balance at the start of the checkpoint. Once the checkpoint is finalized, + // this amount will be added to the total validator balance delta and credited as shares. + uint256 podBalanceWei = + address(this).balance + - nonBeaconChainETHBalanceWei + - (withdrawableRestakedExecutionLayerGwei * GWEI_TO_WEI); + + Checkpoint memory checkpoint = Checkpoint({ + beaconBlockRoot: eigenPodManager.getParentBlockRoot(uint64(block.timestamp)), + beaconStateRoot: bytes32(0), + podBalanceGwei: podBalanceWei / GWEI_TO_WEI, + balanceDeltasGwei: 0, + proofsRemaining: activeValidatorCount + }); - return (balanceDeltaGwei, noLongerStale); + // Place checkpoint in storage + currentCheckpointTimestamp = uint64(block.timestamp); + _updateCheckpoint(checkpoint); } /** diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index ea6775d9a..2c332b0bc 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -139,34 +139,6 @@ contract EigenPodManager is emit PodSharesUpdated(podOwner, sharesDelta); } - /** - * @dev Changes the `podOwner's` stale validator count by `countDelta`. The stale validator - * count can be used as an additional weighting mechanism to determine a staker or operator's shares. - * @param podOwner the pod owner whose stale validator count is being updated - * @param countDelta the change in `podOwner's` stale validator count as a signed integer - * @dev Callable only by the `podOwner's` EigenPod contract - */ - function updateStaleValidatorCount( - address podOwner, - int256 countDelta - ) external onlyEigenPod(podOwner) { - require(podOwner != address(0), "EigenPodManager.updateStaleValidatorCount: podOwner cannot be zero address"); - require(countDelta != 0, "EigenPodManager.updateStaleValidatorCount: invalid countDelta"); - - uint256 currentCount = staleValidatorCount[podOwner]; - uint256 deltaAbs = uint256(countDelta); - - if (countDelta < 0) { - require(deltaAbs <= currentCount, "EigenPodManager.updateStaleValidatorCount: applying countDelta would make count negative"); - - staleValidatorCount[podOwner] -= deltaAbs; - } else { - staleValidatorCount[podOwner] += deltaAbs; - } - - // TODO emit event - } - /** * @notice Used by the DelegationManager to remove a pod owner's shares while they're in the withdrawal queue. * Simply decreases the `podOwner`'s shares by `shares`, down to a minimum of zero. diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index 44fa69835..2bf8a50fa 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -83,9 +83,6 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { uint64 internal _denebForkTimestamp; - /// @dev Maps pod owner address -> number of validators with stale balances - mapping(address => uint256) public staleValidatorCount; - constructor( IETHPOSDeposit _ethPOS, IBeacon _eigenPodBeacon, @@ -105,5 +102,5 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[43] private __gap; + uint256[44] private __gap; } diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 5c2904b1f..d973109f7 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -22,7 +22,7 @@ abstract contract EigenPodStorage is IEigenPod { bool public hasRestaked; /// @notice This is a mapping of validatorPubkeyHash to timestamp to whether or not they have proven a withdrawal for that timestamp - mapping(bytes32 => mapping(uint64 => bool)) public __deprecated_provenWithdrawal; + mapping(bytes32 => mapping(uint64 => bool)) internal __deprecated_provenWithdrawal; /// @notice This is a mapping that tracks a validator's information by their pubkey hash mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; @@ -45,13 +45,10 @@ abstract contract EigenPodStorage is IEigenPod { /// @notice The current checkpoint, if there is one active Checkpoint public currentCheckpoint; - /// @notice Maps pubkey hash -> whether a validator has been marked "stale" - mapping(bytes32 => bool) public isValidatorStale; - /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[37] private __gap; + uint256[38] private __gap; } \ No newline at end of file From cdcb71455f5c85a683ae27e04e4ea85ff3ed5668 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 24 Apr 2024 19:36:47 +0000 Subject: [PATCH 04/85] chore: rename lastFinalizedCheckpoint to lastCheckpointTimestamp * feat: add events for checkpoint creation and progression * feat: remove unneeded oracle interface from EigenPodManager --- src/contracts/interfaces/IEigenPod.sol | 8 +++- src/contracts/interfaces/IEigenPodManager.sol | 6 --- src/contracts/pods/EigenPod.sol | 44 ++++++++++++++++--- src/contracts/pods/EigenPodManager.sol | 20 --------- src/contracts/pods/EigenPodManagerStorage.sol | 7 --- src/contracts/pods/EigenPodStorage.sol | 2 +- src/test/mocks/EigenPodManagerMock.sol | 4 -- 7 files changed, 44 insertions(+), 47 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 9c9d42518..4b527adb7 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -42,10 +42,8 @@ interface IEigenPod { struct Checkpoint { bytes32 beaconBlockRoot; bytes32 beaconStateRoot; - uint256 podBalanceGwei; int256 balanceDeltasGwei; - uint256 proofsRemaining; } @@ -71,6 +69,12 @@ interface IEigenPod { /// @notice Emitted when ETH that was previously received via the `receive` fallback is withdrawn event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn); + /// @notice Emitted when a checkpoint is created + event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot); + + /// @notice Emitted when a validator is proven for a given checkpoint + event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); + /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index cc8a81b68..1620ad8b6 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -130,12 +130,6 @@ interface IEigenPodManager is IPausable { */ function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) external; - /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` - /// @param timestamp of the block for which the parent block root will be returned. MUST correspond - /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method - /// will revert. - function getParentBlockRoot(uint64 timestamp) external view returns (bytes32); - /** * @notice the deneb hard fork timestamp used to determine which proof path to use for proving a withdrawal */ diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 938f85612..19d36cd2a 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -67,6 +67,13 @@ contract EigenPod is /// to a pod owner to prove the slashed validator's balance uint256 internal constant STALENESS_GRACE_PERIOD = 6 hours; + /// @notice The address of the EIP-4788 beacon block root oracle + /// (See https://eips.ethereum.org/EIPS/eip-4788) + address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; + + /// @notice The length of the EIP-4799 beacon block root ring buffer + uint256 internal constant BEACON_ROOTS_HISTORY_BUFFER_LENGTH = 8191; + /******************************************************************************* MODIFIERS *******************************************************************************/ @@ -236,7 +243,7 @@ contract EigenPod is * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and * future checkpoint proofs will need to include them. - * @dev Withdrawal credential proofs MUST NOT be older than the `lastFinalizedCheckpoint` OR `currentCheckpointTimestamp`. + * @dev Withdrawal credential proofs MUST NOT be older than the `lastCheckpointTimestamp` OR `currentCheckpointTimestamp`. * @dev Validators proven via this method MUST NOT have an exit epoch set already. * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. @@ -265,13 +272,13 @@ contract EigenPod is ); require( - beaconTimestamp > lastFinalizedCheckpoint && beaconTimestamp > currentCheckpointTimestamp, + beaconTimestamp > lastCheckpointTimestamp && beaconTimestamp > currentCheckpointTimestamp, "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" ); // Verify passed-in beaconStateRoot against oracle-provided block root: BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), + latestBlockRoot: _getParentBlockRoot(beaconTimestamp), beaconStateRoot: stateRootProof.beaconStateRoot, stateRootProof: stateRootProof.proof }); @@ -345,7 +352,7 @@ contract EigenPod is // Verify `beaconStateRoot` against beacon block root BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: eigenPodManager.getParentBlockRoot(beaconTimestamp), + latestBlockRoot: _getParentBlockRoot(beaconTimestamp), beaconStateRoot: stateRootProof.beaconStateRoot, stateRootProof: stateRootProof.proof }); @@ -548,6 +555,7 @@ contract EigenPod is } _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; + emit ValidatorCheckpointed(beaconTimestamp, uint40(validatorInfo.validatorIndex)); // Calculate change in the validator's balance since the last proof if (newBalanceGwei != prevBalanceGwei) { @@ -576,7 +584,7 @@ contract EigenPod is - (withdrawableRestakedExecutionLayerGwei * GWEI_TO_WEI); Checkpoint memory checkpoint = Checkpoint({ - beaconBlockRoot: eigenPodManager.getParentBlockRoot(uint64(block.timestamp)), + beaconBlockRoot: _getParentBlockRoot(uint64(block.timestamp)), beaconStateRoot: bytes32(0), podBalanceGwei: podBalanceWei / GWEI_TO_WEI, balanceDeltasGwei: 0, @@ -586,6 +594,8 @@ contract EigenPod is // Place checkpoint in storage currentCheckpointTimestamp = uint64(block.timestamp); _updateCheckpoint(checkpoint); + + emit CheckpointCreated(uint64(block.timestamp), checkpoint.beaconBlockRoot); } /** @@ -593,7 +603,7 @@ contract EigenPod is * @dev If the checkpoint has no proofs remaining, it is finalized: * - a share delta is calculated and sent to the `EigenPodManager` * - the checkpointed `podBalance` is added to `withdrawableRestakedExecutionLayerGwei` - * - `lastFinalizedCheckpoint` is updated + * - `lastCheckpointTimestamp` is updated * - `currentCheckpoint` and `currentCheckpointTimestamp` are deleted */ function _updateCheckpoint(Checkpoint memory checkpoint) internal { @@ -606,7 +616,7 @@ contract EigenPod is withdrawableRestakedExecutionLayerGwei += uint64(checkpoint.podBalanceGwei); // Finalize the checkpoint - lastFinalizedCheckpoint = currentCheckpointTimestamp; + lastCheckpointTimestamp = currentCheckpointTimestamp; delete currentCheckpointTimestamp; delete currentCheckpoint; @@ -631,6 +641,26 @@ contract EigenPod is delayedWithdrawalRouter.createDelayedWithdrawal{value: amountWei}(podOwner, recipient); } + /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` + /// @param timestamp of the block for which the parent block root will be returned. MUST correspond + /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method + /// will revert. + function _getParentBlockRoot(uint64 timestamp) internal view returns (bytes32) { + require( + block.timestamp - timestamp < BEACON_ROOTS_HISTORY_BUFFER_LENGTH * 12, + "EigenPod._getParentBlockRoot: timestamp out of range" + ); + + (bool success, bytes memory result) = + BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); + + if (success && result.length > 0) { + return abi.decode(result, (bytes32)); + } else { + revert("EigenPod._getParentBlockRoot: invalid block root returned"); + } + } + function _podWithdrawalCredentials() internal view returns (bytes memory) { return abi.encodePacked(bytes1(uint8(1)), bytes11(0), address(this)); } diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 2c332b0bc..108ed9028 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -297,26 +297,6 @@ contract EigenPodManager is return address(ownerToPod[podOwner]) != address(0); } - /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` - /// @param timestamp of the block for which the parent block root will be returned. MUST correspond - /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method - /// will revert. - function getParentBlockRoot(uint64 timestamp) external view returns (bytes32) { - require( - block.timestamp - timestamp < BEACON_ROOTS_HISTORY_BUFFER_LENGTH * 12, - "EigenPodManager.getParentBlockRoot: timestamp out of range" - ); - - (bool success, bytes memory result) = - BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); - - if (success && result.length > 0) { - return abi.decode(result, (bytes32)); - } else { - revert("EigenPodManager.getParentBlockRoot: invalid block root returned"); - } - } - /** * @notice Wrapper around the `_denebForkTimestamp` storage variable that returns type(uint64).max if the storage variable is unset. * @dev This allows restricting the storage variable to be set once and only once. diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index 2bf8a50fa..238a89da1 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -45,13 +45,6 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { /// @notice Canonical, virtual beacon chain ETH strategy IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); - /// @notice The address of the EIP-4788 beacon block root oracle - /// (See https://eips.ethereum.org/EIPS/eip-4788) - address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; - - /// @notice The length of the EIP-4799 beacon block root ring buffer - uint256 internal constant BEACON_ROOTS_HISTORY_BUFFER_LENGTH = 8191; - /******************************************************************************* STATE VARIABLES *******************************************************************************/ diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index d973109f7..897fef60e 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -37,7 +37,7 @@ abstract contract EigenPodStorage is IEigenPod { uint256 public activeValidatorCount; /// @notice The timestamp of the last checkpoint finalized - uint64 public lastFinalizedCheckpoint; + uint64 public lastCheckpointTimestamp; /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint uint64 public currentCheckpointTimestamp; diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index 308b2e553..06d03afea 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -74,10 +74,6 @@ contract EigenPodManagerMock is IEigenPodManager, Test { function numPods() external view returns (uint256) {} - function getParentBlockRoot(uint64 timestamp) external view returns (bytes32) { - return bytes32(0); - } - function updateStaleValidatorCount(address, int256) external {} function denebForkTimestamp() external pure returns (uint64) { From c9d0a57c32bed50adef6c92ac68c0055f34431a3 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Thu, 25 Apr 2024 17:23:54 +0000 Subject: [PATCH 05/85] feat: remove unnecessary state root caching and add ValidatorWithdrawn event --- src/contracts/interfaces/IEigenPod.sol | 3 ++- src/contracts/pods/EigenPod.sol | 26 ++++++++++---------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 4b527adb7..a38f116b1 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -41,7 +41,6 @@ interface IEigenPod { struct Checkpoint { bytes32 beaconBlockRoot; - bytes32 beaconStateRoot; uint256 podBalanceGwei; int256 balanceDeltasGwei; uint256 proofsRemaining; @@ -75,6 +74,8 @@ interface IEigenPod { /// @notice Emitted when a validator is proven for a given checkpoint event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); + event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); + /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 19d36cd2a..cc0b1b43d 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -184,9 +184,7 @@ contract EigenPod is * (see `_updateCheckpoint` for more details) * @dev This method can only be called when there is a currently-active checkpoint. * @param stateRootProof proves a beacon state root against the checkpoint's `beaconBlockRoot` - * @dev Note that if the `beaconStateRoot` has already been verified for this checkpoint, it does - * not need to be verfied again. - * @param proofs Proofs for one or more validator current balances against the checkpoint's `beaconStateRoot` + * @param proofs Proofs for one or more validator current balances against the `beaconStateRoot` */ function verifyCheckpointProofs( BeaconChainProofs.StateRootProof calldata stateRootProof, @@ -203,17 +201,12 @@ contract EigenPod is Checkpoint memory checkpoint = currentCheckpoint; - // If we haven't already proven a state root for this checkpoint, verify - // `stateRootProof` against the block root and cache the result - if (checkpoint.beaconStateRoot == bytes32(0)) { - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: checkpoint.beaconBlockRoot, - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof - }); - - checkpoint.beaconStateRoot = stateRootProof.beaconStateRoot; - } + // Verify `stateRootProof` against `beaconBlockRoot` + BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ + latestBlockRoot: checkpoint.beaconBlockRoot, + beaconStateRoot: stateRootProof.beaconStateRoot, + stateRootProof: stateRootProof.proof + }); // Process each checkpoint proof submitted for (uint256 i = 0; i < proofs.length; i++) { @@ -227,7 +220,7 @@ contract EigenPod is // the pod when `startCheckpoint` was originally called. int256 balanceDeltaGwei = _verifyCheckpointProof({ beaconTimestamp: beaconTimestamp, - beaconStateRoot: checkpoint.beaconStateRoot, + beaconStateRoot: stateRootProof.beaconStateRoot, proof: proofs[i] }); @@ -552,6 +545,8 @@ contract EigenPod is if (newBalanceGwei == 0) { activeValidatorCount--; validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; + + emit ValidatorWithdrawn(beaconTimestamp, uint40(validatorInfo.validatorIndex)); } _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; @@ -585,7 +580,6 @@ contract EigenPod is Checkpoint memory checkpoint = Checkpoint({ beaconBlockRoot: _getParentBlockRoot(uint64(block.timestamp)), - beaconStateRoot: bytes32(0), podBalanceGwei: podBalanceWei / GWEI_TO_WEI, balanceDeltasGwei: 0, proofsRemaining: activeValidatorCount From a768951f6fcd1d309e5e6b3728ce373474ab6e65 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Thu, 25 Apr 2024 15:51:20 -0400 Subject: [PATCH 06/85] feat: remove all use of the delayed withdrawal router (#524) * modify activateRestaking flow to use checkpointing * remove withdrawNonBeaconChainETHBalanceWei in favor of checkpointing --- script/deploy/mainnet/M2Deploy.s.sol | 1 - src/contracts/interfaces/IEigenPod.sol | 9 -- src/contracts/pods/EigenPod.sol | 74 ++++----- src/contracts/pods/EigenPodStorage.sol | 2 +- src/test/EigenPod.t.sol | 203 +++++++++++-------------- src/test/unit/EigenPodUnit.t.sol | 154 +++++++++---------- 6 files changed, 200 insertions(+), 243 deletions(-) diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index 0c6a2e1f9..a0f91fa4b 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -341,7 +341,6 @@ contract M2Deploy is Script, Test { // Check updated storage values require(eigenPod.hasRestaked(), "eigenPod.hasRestaked not set to true"); require(address(eigenPod).balance == 0, "eigenPod balance not 0 after activating restaking"); - require(eigenPod.nonBeaconChainETHBalanceWei() == 0, "non beacon chain eth balance not 0"); require( eigenPod.mostRecentWithdrawalTimestamp() == block.timestamp, "eigenPod.mostRecentWithdrawalTimestamp not updated" diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index a38f116b1..7c5e50a69 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -79,9 +79,6 @@ interface IEigenPod { /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); - /// @notice any ETH deposited into the EigenPod contract via the `receive` fallback function - function nonBeaconChainETHBalanceWei() external view returns (uint256); - /// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager function initialize(address owner) external; @@ -152,12 +149,6 @@ interface IEigenPod { */ function activateRestaking() external; - /// @notice Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false - function withdrawBeforeRestaking() external; - - /// @notice Called by the pod owner to withdraw the nonBeaconChainETHBalanceWei - function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) external; - /// @notice called by owner of a pod to remove any ERC20s deposited in the pod function recoverTokens(IERC20[] memory tokenList, uint256[] memory amountsToWithdraw, address recipient) external; } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index cc0b1b43d..601f77f2b 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -153,7 +153,6 @@ contract EigenPod is /// @notice payable fallback function that receives ether deposited to the eigenpods contract receive() external payable { - nonBeaconChainETHBalanceWei += msg.value; emit NonBeaconChainETHReceived(msg.value); } @@ -163,7 +162,7 @@ contract EigenPod is * change in ACTIVE validator balance is tracked, and any validators with 0 balance are marked `WITHDRAWN`. * @dev Once finalized, the pod owner is awarded shares corresponding to: * - the total change in their ACTIVE validator balances - * - any ETH in the pod not already awarded shares. + * - any ETH in the pod not already awarded shares * @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If * this is the case, the pod owner MUST complete the existing checkpoint before starting a new one. */ @@ -362,20 +361,6 @@ contract EigenPod is _startCheckpoint(); } - /// @notice Called by the pod owner to withdraw the nonBeaconChainETHBalanceWei - function withdrawNonBeaconChainETHBalanceWei( - address recipient, - uint256 amountToWithdraw - ) external onlyEigenPodOwner onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) { - require( - amountToWithdraw <= nonBeaconChainETHBalanceWei, - "EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei" - ); - nonBeaconChainETHBalanceWei -= amountToWithdraw; - emit NonBeaconChainETHWithdrawn(recipient, amountToWithdraw); - _sendETH_AsDelayedWithdrawal(recipient, amountToWithdraw); - } - /// @notice called by owner of a pod to remove any ERC20s deposited in the pod function recoverTokens( IERC20[] memory tokenList, @@ -403,14 +388,9 @@ contract EigenPod is hasNeverRestaked { hasRestaked = true; - _processWithdrawalBeforeRestaking(podOwner); emit RestakingActivated(podOwner); - } - - /// @notice Called by the pod owner to withdraw the balance of the pod when `hasRestaked` is set to false - function withdrawBeforeRestaking() external onlyEigenPodOwner hasNeverRestaked { - _processWithdrawalBeforeRestaking(podOwner); + _startCheckpoint(); } /// @notice Called by EigenPodManager when the owner wants to create another ETH validator. @@ -565,27 +545,47 @@ contract EigenPod is return balanceDeltaGwei; } + /** + * @dev Initiate a checkpoint proof by snapshotting both the pod's ETH balance and the + * current block's parent block root. After providing a checkpoint proof for each of the + * pod's ACTIVE validators, the pod's ETH balance is awarded shares and can be withdrawn. + * @dev ACTIVE validators are validators with verified withdrawal credentials (See + * `verifyWithdrawalCredentials` for details) + * @dev If the pod does not have any ACTIVE validators, the checkpoint is automatically + * finalized. + * @dev Once started, a checkpoint MUST be completed! It is not possible to start a + * checkpoint if the existing one is incomplete. + */ function _startCheckpoint() internal { require( currentCheckpointTimestamp == 0, "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" ); - // Snapshot pod balance at the start of the checkpoint. Once the checkpoint is finalized, - // this amount will be added to the total validator balance delta and credited as shares. - uint256 podBalanceWei = - address(this).balance - - nonBeaconChainETHBalanceWei - - (withdrawableRestakedExecutionLayerGwei * GWEI_TO_WEI); - + // Snapshot pod balance at the start of the checkpoint, subtracting pod balance that has + // previously been credited with shares. Once the checkpoint is finalized, `podBalanceGwei` + // will be added to the total validator balance delta and credited as shares. + // + // Note: On finalization, `podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei` + // to denote that it has been credited with shares. Because this value is denominated in gwei, + // `podBalanceGwei` is also converted to a gwei amount here. This means that any sub-gwei amounts + // sent to the pod are not credited with shares and are therefore not withdrawable. + // This can be addressed by topping up a pod's balance to a value divisible by 1 gwei. + uint256 podBalanceGwei = + (address(this).balance / GWEI_TO_WEI) - withdrawableRestakedExecutionLayerGwei; + + // Create checkpoint using the previous block's root for proofs, and the current + // `activeValidatorCount` as the number of checkpoint proofs needed to finalize + // the checkpoint. Checkpoint memory checkpoint = Checkpoint({ beaconBlockRoot: _getParentBlockRoot(uint64(block.timestamp)), - podBalanceGwei: podBalanceWei / GWEI_TO_WEI, + podBalanceGwei: podBalanceGwei, balanceDeltasGwei: 0, proofsRemaining: activeValidatorCount }); - // Place checkpoint in storage + // Place checkpoint in storage. If `proofsRemaining` is 0, the checkpoint + // is automatically finalized. currentCheckpointTimestamp = uint64(block.timestamp); _updateCheckpoint(checkpoint); @@ -596,7 +596,7 @@ contract EigenPod is * @dev Finish progress on a checkpoint and store it in state. * @dev If the checkpoint has no proofs remaining, it is finalized: * - a share delta is calculated and sent to the `EigenPodManager` - * - the checkpointed `podBalance` is added to `withdrawableRestakedExecutionLayerGwei` + * - the checkpointed `podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei` * - `lastCheckpointTimestamp` is updated * - `currentCheckpoint` and `currentCheckpointTimestamp` are deleted */ @@ -621,20 +621,10 @@ contract EigenPod is } } - function _processWithdrawalBeforeRestaking(address _podOwner) internal { - mostRecentWithdrawalTimestamp = uint32(block.timestamp); - nonBeaconChainETHBalanceWei = 0; - _sendETH_AsDelayedWithdrawal(_podOwner, address(this).balance); - } - function _sendETH(address recipient, uint256 amountWei) internal { Address.sendValue(payable(recipient), amountWei); } - function _sendETH_AsDelayedWithdrawal(address recipient, uint256 amountWei) internal { - delayedWithdrawalRouter.createDelayedWithdrawal{value: amountWei}(podOwner, recipient); - } - /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` /// @param timestamp of the block for which the parent block root will be returned. MUST correspond /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 897fef60e..41a2e3b24 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -28,7 +28,7 @@ abstract contract EigenPodStorage is IEigenPod { mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; /// @notice This variable tracks any ETH deposited into this contract via the `receive` fallback function - uint256 public nonBeaconChainETHBalanceWei; + uint256 internal __deprecated_nonBeaconChainETHBalanceWei; /// @notice This variable tracks the total amount of partial withdrawals claimed via merkle proofs prior to a switch to ZK proofs for claiming partial withdrawals uint64 __deprecated_sumOfPartialWithdrawalsClaimedGwei; diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index e52e9b5be..408e5dcc7 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -274,39 +274,39 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - function testWithdrawBeforeRestaking() public { - testStaking(); - IEigenPod pod = eigenPodManager.getPod(podOwner); + // function testWithdrawBeforeRestaking() public { + // testStaking(); + // IEigenPod pod = eigenPodManager.getPod(podOwner); - //simulate that hasRestaked is set to false, so that we can test withdrawBeforeRestaking for pods deployed before M2 activation - cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); - require(pod.hasRestaked() == false, "Pod should not be restaked"); + // //simulate that hasRestaked is set to false, so that we can test withdrawBeforeRestaking for pods deployed before M2 activation + // cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); + // require(pod.hasRestaked() == false, "Pod should not be restaked"); - // simulate a withdrawal - cheats.deal(address(pod), stakeAmount); - cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalCreated( - podOwner, - podOwner, - stakeAmount, - delayedWithdrawalRouter.userWithdrawalsLength(podOwner) - ); + // // simulate a withdrawal + // cheats.deal(address(pod), stakeAmount); + // cheats.startPrank(podOwner); + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalCreated( + // podOwner, + // podOwner, + // stakeAmount, + // delayedWithdrawalRouter.userWithdrawalsLength(podOwner) + // ); - uint timestampBeforeTx = pod.mostRecentWithdrawalTimestamp(); + // uint timestampBeforeTx = pod.mostRecentWithdrawalTimestamp(); - pod.withdrawBeforeRestaking(); + // pod.withdrawBeforeRestaking(); - require(_getLatestDelayedWithdrawalAmount(podOwner) == stakeAmount, "Payment amount should be stake amount"); - require( - pod.mostRecentWithdrawalTimestamp() == uint64(block.timestamp), - "Most recent withdrawal block number not updated" - ); - require( - pod.mostRecentWithdrawalTimestamp() > timestampBeforeTx, - "Most recent withdrawal block number not updated" - ); - } + // require(_getLatestDelayedWithdrawalAmount(podOwner) == stakeAmount, "Payment amount should be stake amount"); + // require( + // pod.mostRecentWithdrawalTimestamp() == uint64(block.timestamp), + // "Most recent withdrawal block number not updated" + // ); + // require( + // pod.mostRecentWithdrawalTimestamp() > timestampBeforeTx, + // "Most recent withdrawal block number not updated" + // ); + // } function testDeployEigenPodWithoutActivateRestaking() public { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" @@ -492,69 +492,69 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { _proveWithdrawalForPod(newPod); } - function testWithdrawNonBeaconChainETHBalanceWei() public { - IEigenPod pod = testDeployAndVerifyNewEigenPod(); + // function testWithdrawNonBeaconChainETHBalanceWei() public { + // IEigenPod pod = testDeployAndVerifyNewEigenPod(); - cheats.deal(address(podOwner), 10 ether); - emit log_named_address("Pod:", address(pod)); + // cheats.deal(address(podOwner), 10 ether); + // emit log_named_address("Pod:", address(pod)); - uint256 balanceBeforeDeposit = pod.nonBeaconChainETHBalanceWei(); + // uint256 balanceBeforeDeposit = pod.nonBeaconChainETHBalanceWei(); - (bool sent, ) = payable(address(pod)).call{value: 1 ether}(""); + // (bool sent, ) = payable(address(pod)).call{value: 1 ether}(""); - require(sent == true, "not sent"); + // require(sent == true, "not sent"); - uint256 balanceAfterDeposit = pod.nonBeaconChainETHBalanceWei(); + // uint256 balanceAfterDeposit = pod.nonBeaconChainETHBalanceWei(); - require( - balanceBeforeDeposit < balanceAfterDeposit - && (balanceAfterDeposit - balanceBeforeDeposit) == 1 ether, - "increment checks" - ); + // require( + // balanceBeforeDeposit < balanceAfterDeposit + // && (balanceAfterDeposit - balanceBeforeDeposit) == 1 ether, + // "increment checks" + // ); - cheats.startPrank(podOwner, podOwner); - cheats.expectEmit(true, true, true, true, address(pod)); - emit NonBeaconChainETHWithdrawn(podOwner, 1 ether); - pod.withdrawNonBeaconChainETHBalanceWei( - podOwner, - 1 ether - ); + // cheats.startPrank(podOwner, podOwner); + // cheats.expectEmit(true, true, true, true, address(pod)); + // emit NonBeaconChainETHWithdrawn(podOwner, 1 ether); + // pod.withdrawNonBeaconChainETHBalanceWei( + // podOwner, + // 1 ether + // ); - uint256 balanceAfterWithdrawal = pod.nonBeaconChainETHBalanceWei(); + // uint256 balanceAfterWithdrawal = pod.nonBeaconChainETHBalanceWei(); - require( - balanceAfterWithdrawal < balanceAfterDeposit - && balanceAfterWithdrawal == balanceBeforeDeposit, - "decrement checks" - ); + // require( + // balanceAfterWithdrawal < balanceAfterDeposit + // && balanceAfterWithdrawal == balanceBeforeDeposit, + // "decrement checks" + // ); - cheats.stopPrank(); - } + // cheats.stopPrank(); + // } - function testWithdrawFromPod() public { - IEigenPod pod = eigenPodManager.getPod(podOwner); - cheats.startPrank(podOwner); + // function testWithdrawFromPod() public { + // IEigenPod pod = eigenPodManager.getPod(podOwner); + // cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(pod)); - emit EigenPodStaked(pubkey); + // cheats.expectEmit(true, true, true, true, address(pod)); + // emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); + // eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + // cheats.stopPrank(); - cheats.deal(address(pod), stakeAmount); + // cheats.deal(address(pod), stakeAmount); - // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert - cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); + // // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert + // cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); - cheats.startPrank(podOwner); - uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(podOwner); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - //cheats.expectEmit(true, true, true, true); - emit DelayedWithdrawalCreated(podOwner, podOwner, stakeAmount, userWithdrawalsLength); - pod.withdrawBeforeRestaking(); - cheats.stopPrank(); - require(address(pod).balance == 0, "Pod balance should be 0"); - } + // cheats.startPrank(podOwner); + // uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(podOwner); + // // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // //cheats.expectEmit(true, true, true, true); + // emit DelayedWithdrawalCreated(podOwner, podOwner, stakeAmount, userWithdrawalsLength); + // pod.withdrawBeforeRestaking(); + // cheats.stopPrank(); + // require(address(pod).balance == 0, "Pod balance should be 0"); + // } // function testFullWithdrawalProof() public { // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); @@ -903,17 +903,10 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); // IEigenPod newPod = eigenPodManager.getPod(podOwner); -<<<<<<< HEAD - cheats.warp(block.timestamp + 1); - // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - _proveOverCommittedStake(newPod); -======= - // cheats.warp(GOERLI_GENESIS_TIME); + // cheats.warp(block.timestamp + 1); // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); // _proveOverCommittedStake(newPod); ->>>>>>> a524406e (feat: poc for partial withdrawal batching) // uint64 newValidatorBalance = _getValidatorUpdatedBalance(); // int256 beaconChainETHShares = eigenPodManager.podOwnerShares(podOwner); @@ -1091,19 +1084,11 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // .validatorPubkeyHashToInfo(validatorPubkeyHash) // .restakedBalanceGwei; -<<<<<<< HEAD - // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // prove overcommitted balance - cheats.warp(block.timestamp + 1); - _proveOverCommittedStake(newPod); -======= // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); // // prove overcommitted balance - // cheats.warp(GOERLI_GENESIS_TIME); + // cheats.warp(block.timestamp + 1); // _proveOverCommittedStake(newPod); ->>>>>>> a524406e (feat: poc for partial withdrawal batching) // uint256 validatorRestakedBalanceAfter = newPod // .validatorPubkeyHashToInfo(validatorPubkeyHash) @@ -1139,19 +1124,11 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // .validatorPubkeyHashToInfo(validatorPubkeyHash) // .restakedBalanceGwei; -<<<<<<< HEAD - // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // prove overcommitted balance - cheats.warp(block.timestamp + 1); - _proveOverCommittedStake(newPod); -======= // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); // // prove overcommitted balance - // cheats.warp(GOERLI_GENESIS_TIME); + // cheats.warp(block.timestamp + 1); // _proveOverCommittedStake(newPod); ->>>>>>> a524406e (feat: poc for partial withdrawal batching) // cheats.warp(block.timestamp + 1); // // ./solidityProofGen "BalanceUpdateProof" 302913 false 100 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json" @@ -1230,20 +1207,20 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - function testCallWithdrawBeforeRestakingFromNonOwner(address nonPodOwner) external fuzzedAddress(nonPodOwner) { - cheats.assume(nonPodOwner != podOwner); - testStaking(); - IEigenPod pod = eigenPodManager.getPod(podOwner); + // function testCallWithdrawBeforeRestakingFromNonOwner(address nonPodOwner) external fuzzedAddress(nonPodOwner) { + // cheats.assume(nonPodOwner != podOwner); + // testStaking(); + // IEigenPod pod = eigenPodManager.getPod(podOwner); - // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert - cheats.store(address(pod), bytes32(uint256(52)), bytes32(0)); - require(pod.hasRestaked() == false, "Pod should not be restaked"); + // // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert + // cheats.store(address(pod), bytes32(uint256(52)), bytes32(0)); + // require(pod.hasRestaked() == false, "Pod should not be restaked"); - //simulate a withdrawal - cheats.startPrank(nonPodOwner); - cheats.expectRevert(bytes("EigenPod.onlyEigenPodOwner: not podOwner")); - pod.withdrawBeforeRestaking(); - } + // //simulate a withdrawal + // cheats.startPrank(nonPodOwner); + // cheats.expectRevert(bytes("EigenPod.onlyEigenPodOwner: not podOwner")); + // pod.withdrawBeforeRestaking(); + // } /* test deprecated since this is checked on the EigenPodManager level, rather than the EigenPod level TODO: @Sidu28 - check whether we have adequate coverage of the correct function diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index a34a6bb2c..0e74b61da 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -177,35 +177,35 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven Withdraw Non Beacon Chain ETH Tests *******************************************************************************/ - function testFuzz_withdrawNonBeaconChainETH_revert_notPodOwner(address invalidCaller) public { - cheats.assume(invalidCaller != podOwner); + // function testFuzz_withdrawNonBeaconChainETH_revert_notPodOwner(address invalidCaller) public { + // cheats.assume(invalidCaller != podOwner); - cheats.prank(invalidCaller); - cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - eigenPod.withdrawNonBeaconChainETHBalanceWei(invalidCaller, 1 ether); - } + // cheats.prank(invalidCaller); + // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); + // eigenPod.withdrawNonBeaconChainETHBalanceWei(invalidCaller, 1 ether); + // } - function test_withdrawNonBeaconChainETH_revert_tooMuchWithdrawn() public { - // Send EigenPod 0.9 ether - _seedPodWithETH(0.9 ether); + // function test_withdrawNonBeaconChainETH_revert_tooMuchWithdrawn() public { + // // Send EigenPod 0.9 ether + // _seedPodWithETH(0.9 ether); - // Withdraw 1 ether - cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); - eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 1 ether); - } + // // Withdraw 1 ether + // cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); + // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 1 ether); + // } - function testFuzz_withdrawNonBeaconChainETH(uint256 ethAmount) public { - _seedPodWithETH(ethAmount); - assertEq(eigenPod.nonBeaconChainETHBalanceWei(), ethAmount, "Incorrect amount incremented in receive function"); + // function testFuzz_withdrawNonBeaconChainETH(uint256 ethAmount) public { + // _seedPodWithETH(ethAmount); + // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), ethAmount, "Incorrect amount incremented in receive function"); - cheats.expectEmit(true, true, true, true); - emit NonBeaconChainETHWithdrawn(podOwner, ethAmount); - eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, ethAmount); + // cheats.expectEmit(true, true, true, true); + // emit NonBeaconChainETHWithdrawn(podOwner, ethAmount); + // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, ethAmount); - // Checks - assertEq(address(eigenPod).balance, 0, "Incorrect amount withdrawn from eigenPod"); - assertEq(address(delayedWithdrawalRouterMock).balance, ethAmount, "Incorrect amount set to delayed withdrawal router"); - } + // // Checks + // assertEq(address(eigenPod).balance, 0, "Incorrect amount withdrawn from eigenPod"); + // assertEq(address(delayedWithdrawalRouterMock).balance, ethAmount, "Incorrect amount set to delayed withdrawal router"); + // } /******************************************************************************* Recover Tokens Tests @@ -270,19 +270,19 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven eigenPod.activateRestaking(); } - function testFuzz_activateRestaking(uint256 ethAmount) public hasNotRestaked { - // Seed some ETH - _seedPodWithETH(ethAmount); + // function testFuzz_activateRestaking(uint256 ethAmount) public hasNotRestaked { + // // Seed some ETH + // _seedPodWithETH(ethAmount); - // Activate restaking - vm.expectEmit(true, true, true, true); - emit RestakingActivated(podOwner); - eigenPod.activateRestaking(); + // // Activate restaking + // vm.expectEmit(true, true, true, true); + // emit RestakingActivated(podOwner); + // eigenPod.activateRestaking(); - // Checks - assertTrue(eigenPod.hasRestaked(), "hasRestaked incorrectly set"); - _assertWithdrawalProcessed(ethAmount); - } + // // Checks + // assertTrue(eigenPod.hasRestaked(), "hasRestaked incorrectly set"); + // _assertWithdrawalProcessed(ethAmount); + // } /** * This is a regression test for a bug (EIG-14) found by Hexens. Lets say podOwner sends 32 ETH to the EigenPod, @@ -293,67 +293,67 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven * And simply withdraw the 32ETH because nonBeaconChainETHBalanceWei is 32ETH. This was an issue because * nonBeaconChainETHBalanceWei was never zeroed out in _processWithdrawalBeforeRestaking */ - function test_regression_validatorBalance_cannotBeRemoved_viaNonBeaconChainETHBalanceWei() external hasNotRestaked { - // Assert that the pod has not restaked - assertFalse(eigenPod.hasRestaked(), "hasRestaked should be false"); + // function test_regression_validatorBalance_cannotBeRemoved_viaNonBeaconChainETHBalanceWei() external hasNotRestaked { + // // Assert that the pod has not restaked + // assertFalse(eigenPod.hasRestaked(), "hasRestaked should be false"); - // Simulate podOwner sending 32 ETH to eigenPod - _seedPodWithETH(32 ether); - assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 32 ether, "nonBeaconChainETHBalanceWei should be 32 ETH"); + // // Simulate podOwner sending 32 ETH to eigenPod + // _seedPodWithETH(32 ether); + // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 32 ether, "nonBeaconChainETHBalanceWei should be 32 ETH"); - // Pod owner calls withdrawBeforeRestaking, sending 32 ETH to owner - eigenPod.withdrawBeforeRestaking(); - assertEq(address(eigenPod).balance, 0, "eigenPod balance should be 0"); - assertEq(address(delayedWithdrawalRouterMock).balance, 32 ether, "withdrawal router balance should be 32 ETH"); + // // Pod owner calls withdrawBeforeRestaking, sending 32 ETH to owner + // eigenPod.withdrawBeforeRestaking(); + // assertEq(address(eigenPod).balance, 0, "eigenPod balance should be 0"); + // assertEq(address(delayedWithdrawalRouterMock).balance, 32 ether, "withdrawal router balance should be 32 ETH"); - // Upgrade from m1 to m2 + // // Upgrade from m1 to m2 - // Activate restaking on the pod - eigenPod.activateRestaking(); + // // Activate restaking on the pod + // eigenPod.activateRestaking(); - // Simulate a withdrawal by increasing eth balance without code execution - cheats.deal(address(eigenPod), 32 ether); + // // Simulate a withdrawal by increasing eth balance without code execution + // cheats.deal(address(eigenPod), 32 ether); - // Try calling withdrawNonBeaconChainETHBalanceWei, should fail since `nonBeaconChainETHBalanceWei` - // was set to 0 when calling `_processWithdrawalBeforeRestaking` from `activateRestaking` - cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); - eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 32 ether); - } + // // Try calling withdrawNonBeaconChainETHBalanceWei, should fail since `nonBeaconChainETHBalanceWei` + // // was set to 0 when calling `_processWithdrawalBeforeRestaking` from `activateRestaking` + // cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); + // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 32 ether); + // } /******************************************************************************* Withdraw Before Restaking Tests *******************************************************************************/ - function testFuzz_withdrawBeforeRestaking_revert_notPodOwner(address invalidCaller) public filterFuzzedAddressInputs(invalidCaller) { - cheats.assume(invalidCaller != podOwner); + // function testFuzz_withdrawBeforeRestaking_revert_notPodOwner(address invalidCaller) public filterFuzzedAddressInputs(invalidCaller) { + // cheats.assume(invalidCaller != podOwner); - cheats.prank(invalidCaller); - cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - eigenPod.withdrawBeforeRestaking(); - } + // cheats.prank(invalidCaller); + // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); + // eigenPod.withdrawBeforeRestaking(); + // } - function test_withdrawBeforeRestaking_revert_alreadyRestaked() public { - cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); - eigenPod.withdrawBeforeRestaking(); - } + // function test_withdrawBeforeRestaking_revert_alreadyRestaked() public { + // cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); + // eigenPod.withdrawBeforeRestaking(); + // } - function testFuzz_withdrawBeforeRestaking(uint256 ethAmount) public hasNotRestaked { - // Seed some ETH - _seedPodWithETH(ethAmount); + // function testFuzz_withdrawBeforeRestaking(uint256 ethAmount) public hasNotRestaked { + // // Seed some ETH + // _seedPodWithETH(ethAmount); - // Withdraw - eigenPod.withdrawBeforeRestaking(); + // // Withdraw + // eigenPod.withdrawBeforeRestaking(); - // Checks - _assertWithdrawalProcessed(ethAmount); - } + // // Checks + // _assertWithdrawalProcessed(ethAmount); + // } // Helpers - function _assertWithdrawalProcessed(uint256 amount) internal { - assertEq(eigenPod.mostRecentWithdrawalTimestamp(), uint32(block.timestamp), "Incorrect mostRecentWithdrawalTimestamp"); - assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 0, "Incorrect nonBeaconChainETHBalanceWei"); - assertEq(address(delayedWithdrawalRouterMock).balance, amount, "Incorrect amount sent to delayed withdrawal router"); - } + // function _assertWithdrawalProcessed(uint256 amount) internal { + // assertEq(eigenPod.mostRecentWithdrawalTimestamp(), uint32(block.timestamp), "Incorrect mostRecentWithdrawalTimestamp"); + // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 0, "Incorrect nonBeaconChainETHBalanceWei"); + // assertEq(address(delayedWithdrawalRouterMock).balance, amount, "Incorrect amount sent to delayed withdrawal router"); + // } function _seedPodWithETH(uint256 ethAmount) internal { cheats.deal(address(this), ethAmount); From 864b81a5767188a169c113b5f817df789d0a4b9f Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 29 Apr 2024 15:22:25 +0000 Subject: [PATCH 07/85] feat: remove staleness grace period --- src/contracts/pods/EigenPod.sol | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 601f77f2b..49e8b6392 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -63,10 +63,6 @@ contract EigenPod is /// via `verifyStaleBalance`. uint256 internal constant TIME_TILL_STALE_BALANCE = 2 weeks; - /// @notice A `verifyStaleBalance` proof MUST be older than `STALENESS_GRACE_PERIOD`, to give time - /// to a pod owner to prove the slashed validator's balance - uint256 internal constant STALENESS_GRACE_PERIOD = 6 hours; - /// @notice The address of the EIP-4788 beacon block root oracle /// (See https://eips.ethereum.org/EIPS/eip-4788) address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; @@ -303,7 +299,6 @@ contract EigenPod is * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator * * @dev Staleness conditions: - * - `beaconTimestamp` MUST NOT fall within `STALENESS_GRACE_PERIOD` seconds of `block.timestamp` * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` * - Validator MUST be in `ACTIVE` status in the pod * - Validator MUST be slashed on the beacon chain @@ -316,11 +311,6 @@ contract EigenPod is external onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) { - require( - beaconTimestamp + STALENESS_GRACE_PERIOD < block.timestamp, - "EigenPod.verifyStaleBalance: staleness grace period not elapsed" - ); - bytes32 validatorPubkey = proof.validatorFields.getPubkeyHash(); ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkey]; From fd765241af1db088faccef232ac2b04575ca6194 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 29 Apr 2024 15:30:16 +0000 Subject: [PATCH 08/85] feat: add flag to startCheckpoint to prevent 0-balance checkpoints --- src/contracts/pods/EigenPod.sol | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 49e8b6392..b9d271c85 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -161,14 +161,16 @@ contract EigenPod is * - any ETH in the pod not already awarded shares * @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If * this is the case, the pod owner MUST complete the existing checkpoint before starting a new one. + * @param revertIfNoBalance Forces a revert if the pod ETH balance is 0. This allows the pod owner + * to prevent accidentally starting a checkpoint that will not increase their shares */ - function startCheckpoint() + function startCheckpoint(bool revertIfNoBalance) external onlyEigenPodOwner() onlyWhenNotPaused(PAUSED_START_CHECKPOINT) afterRestaking(uint64(block.timestamp)) /// TODO - this is the wrong condition { - _startCheckpoint(); + _startCheckpoint(revertIfNoBalance); } /** @@ -348,7 +350,7 @@ contract EigenPod is }); // Validator verified to be stale - start a checkpoint - _startCheckpoint(); + _startCheckpoint(false); } /// @notice called by owner of a pod to remove any ERC20s deposited in the pod @@ -380,7 +382,7 @@ contract EigenPod is hasRestaked = true; emit RestakingActivated(podOwner); - _startCheckpoint(); + _startCheckpoint(false); } /// @notice Called by EigenPodManager when the owner wants to create another ETH validator. @@ -545,8 +547,10 @@ contract EigenPod is * finalized. * @dev Once started, a checkpoint MUST be completed! It is not possible to start a * checkpoint if the existing one is incomplete. + * @param revertIfNoBalance If the available ETH balance for checkpointing is 0 and this is + * true, this method will revert */ - function _startCheckpoint() internal { + function _startCheckpoint(bool revertIfNoBalance) internal { require( currentCheckpointTimestamp == 0, "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" @@ -564,6 +568,11 @@ contract EigenPod is uint256 podBalanceGwei = (address(this).balance / GWEI_TO_WEI) - withdrawableRestakedExecutionLayerGwei; + // If the caller doesn't want a "0 balance" checkpoint, revert + if (revertIfNoBalance && podBalanceGwei == 0) { + revert("EigenPod._startCheckpoint: no balance available to checkpoint"); + } + // Create checkpoint using the previous block's root for proofs, and the current // `activeValidatorCount` as the number of checkpoint proofs needed to finalize // the checkpoint. From 27c29c888190ee066b4af854e31a62e250afe1c3 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 29 Apr 2024 15:43:58 +0000 Subject: [PATCH 09/85] chore: move currentCheckpoint to a public getter and update IEigenPod interface * chore: fix comment, update interfaces, add event * chore: clarify comment on activateRestaking --- src/contracts/interfaces/IEigenPod.sol | 98 ++++++++++++++++++++++---- src/contracts/pods/EigenPod.sol | 34 +++++---- src/contracts/pods/EigenPodStorage.sol | 2 +- src/test/mocks/EigenPodMock.sol | 24 +++++++ 4 files changed, 131 insertions(+), 27 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 7c5e50a69..936455a57 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -65,15 +65,16 @@ interface IEigenPod { /// @notice Emitted when ETH is received via the `receive` fallback event NonBeaconChainETHReceived(uint256 amountReceived); - /// @notice Emitted when ETH that was previously received via the `receive` fallback is withdrawn - event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn); - /// @notice Emitted when a checkpoint is created event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot); + /// @notice Emitted when a checkpoint is finalized + event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei); + /// @notice Emitted when a validator is proven for a given checkpoint event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); + /// @notice Emitted when a validaor is proven to have 0 balance at a given checkpoint event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), @@ -122,26 +123,95 @@ interface IEigenPod { /// @notice This returns the status of a given validator pubkey function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS); + /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals + function activeValidatorCount() external view returns (uint256); + + /// @notice The timestamp of the last checkpoint finalized + function lastCheckpointTimestamp() external view returns (uint64); + + /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint + function currentCheckpointTimestamp() external view returns (uint64); + + /// @notice Returns the currently-active checkpoint + function currentCheckpoint() external view returns (Checkpoint memory); + + /** + * @dev Create a checkpoint used to prove this pod's active validator set. Checkpoints are completed + * by submitting one checkpoint proof per ACTIVE validator. During the checkpoint process, the total + * change in ACTIVE validator balance is tracked, and any validators with 0 balance are marked `WITHDRAWN`. + * @dev Once finalized, the pod owner is awarded shares corresponding to: + * - the total change in their ACTIVE validator balances + * - any ETH in the pod not already awarded shares + * @dev A checkpoint cannot be created if the pod already has an outstanding checkpoint. If + * this is the case, the pod owner MUST complete the existing checkpoint before starting a new one. + * @param revertIfNoBalance Forces a revert if the pod ETH balance is 0. This allows the pod owner + * to prevent accidentally starting a checkpoint that will not increase their shares + */ + function startCheckpoint(bool revertIfNoBalance) external; + + /** + * @dev Progress the current checkpoint towards completion by submitting one or more validator + * checkpoint proofs. Anyone can call this method to submit proofs towards the current checkpoint. + * For each validator proven, the current checkpoint's `proofsRemaining` decreases. + * @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized. + * (see `_updateCheckpoint` for more details) + * @dev This method can only be called when there is a currently-active checkpoint. + * @param stateRootProof proves a beacon state root against the checkpoint's `beaconBlockRoot` + * @param proofs Proofs for one or more validator current balances against the `beaconStateRoot` + */ + function verifyCheckpointProofs( + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceProof[] calldata proofs + ) + external; + /** - * @notice This function verifies that the withdrawal credentials of validator(s) owned by the podOwner are pointed to - * this contract. It also verifies the effective balance of the validator. It verifies the provided proof of the ETH validator against the beacon chain state - * root, marks the validator as 'active' in EigenLayer, and credits the restaked ETH in Eigenlayer. - * @param oracleTimestamp is the Beacon Chain timestamp whose state root the `proof` will be proven against. - * @param validatorIndices is the list of indices of the validators being proven, refer to consensus specs - * @param withdrawalCredentialProofs is an array of proofs, where each proof proves each ETH validator's balance and withdrawal credentials - * against a beacon chain state root - * @param validatorFields are the fields of the "Validator Container", refer to consensus specs - * for details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award + * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and + * future checkpoint proofs will need to include them. + * @dev Withdrawal credential proofs MUST NOT be older than the `lastCheckpointTimestamp` OR `currentCheckpointTimestamp`. + * @dev Validators proven via this method MUST NOT have an exit epoch set already. + * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds + * to the parent beacon block root against which the proof is verified. + * @param stateRootProof proves a beacon state root against a beacon block root + * @param validatorIndices a list of validator indices being proven stale + * @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root + * @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for + * details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator */ function verifyWithdrawalCredentials( - uint64 oracleTimestamp, + uint64 beaconTimestamp, BeaconChainProofs.StateRootProof calldata stateRootProof, uint40[] calldata validatorIndices, - bytes[] calldata withdrawalCredentialProofs, + bytes[] calldata validatorFieldsProofs, bytes32[][] calldata validatorFields ) external; + /** + * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely + * checkpoint proofs since being slashed. If successful, this allows the caller to start a checkpoint. + * @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed! + * (See `_startCheckpoint` for details) + * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds + * to the parent beacon block root against which the proof is verified. + * @param stateRootProof proves a beacon state root against a beacon block root + * @param proof the fields of the beacon chain "Validator" container, along with a merkle proof against + * the beacon state root. See the consensus specs for more details: + * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + * + * @dev Staleness conditions: + * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` + * - Validator MUST be in `ACTIVE` status in the pod + * - Validator MUST be slashed on the beacon chain + */ + function verifyStaleBalance( + uint64 beaconTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.ValidatorProof calldata proof + ) + external; + /** * @notice Called by the pod owner to activate restaking by withdrawing * all existing ETH from the pod and preventing further withdrawals via diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index b9d271c85..25c3cdb36 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -196,7 +196,7 @@ contract EigenPod is "EigenPod.verifyCheckpointProofs: must have active checkpoint to perform checkpoint proof" ); - Checkpoint memory checkpoint = currentCheckpoint; + Checkpoint memory checkpoint = _currentCheckpoint; // Verify `stateRootProof` against `beaconBlockRoot` BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ @@ -370,8 +370,11 @@ contract EigenPod is /** * @notice Called by the pod owner to activate restaking by withdrawing - * all existing ETH from the pod and preventing further withdrawals via - * "withdrawBeforeRestaking()" + * all existing ETH from the pod by starting a checkpoint. Once this is called, + * the pod owner can begin proving validator withdrawal credentials and checkpoints + * to receive shares for beacon chain ETH. + * Note: This method is only callable on pods that were deployed *before* the M2 + * upgrade. After the M2 upgrade, restaking is enabled by default. */ function activateRestaking() external @@ -487,6 +490,7 @@ contract EigenPod is BeaconChainProofs.BalanceProof calldata proof ) internal returns (int256 balanceDeltaGwei) { ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proof.pubkeyHash]; + uint40 validatorIndex = uint40(validatorInfo.validatorIndex); require( validatorInfo.status == VALIDATOR_STATUS.ACTIVE, @@ -507,7 +511,7 @@ contract EigenPod is uint64 prevBalanceGwei = validatorInfo.restakedBalanceGwei; uint64 newBalanceGwei = BeaconChainProofs.verifyValidatorBalance({ beaconStateRoot: beaconStateRoot, - validatorIndex: uint40(validatorInfo.validatorIndex), + validatorIndex: validatorIndex, proof: proof }); @@ -518,15 +522,15 @@ contract EigenPod is activeValidatorCount--; validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; - emit ValidatorWithdrawn(beaconTimestamp, uint40(validatorInfo.validatorIndex)); + emit ValidatorWithdrawn(beaconTimestamp, validatorIndex); } _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; - emit ValidatorCheckpointed(beaconTimestamp, uint40(validatorInfo.validatorIndex)); + emit ValidatorCheckpointed(beaconTimestamp, validatorIndex); // Calculate change in the validator's balance since the last proof if (newBalanceGwei != prevBalanceGwei) { - emit ValidatorBalanceUpdated(uint40(validatorInfo.validatorIndex), beaconTimestamp, newBalanceGwei); + emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, newBalanceGwei); balanceDeltaGwei = _calcBalanceDelta({ newAmountGwei: newBalanceGwei, @@ -597,7 +601,7 @@ contract EigenPod is * - a share delta is calculated and sent to the `EigenPodManager` * - the checkpointed `podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei` * - `lastCheckpointTimestamp` is updated - * - `currentCheckpoint` and `currentCheckpointTimestamp` are deleted + * - `_currentCheckpoint` and `currentCheckpointTimestamp` are deleted */ function _updateCheckpoint(Checkpoint memory checkpoint) internal { if (checkpoint.proofsRemaining == 0) { @@ -611,12 +615,13 @@ contract EigenPod is // Finalize the checkpoint lastCheckpointTimestamp = currentCheckpointTimestamp; delete currentCheckpointTimestamp; - delete currentCheckpoint; + delete _currentCheckpoint; // Update pod owner's shares eigenPodManager.recordBeaconChainETHBalanceUpdate(podOwner, totalShareDeltaWei); + emit CheckpointFinalized(lastCheckpointTimestamp, totalShareDeltaWei); } else { - currentCheckpoint = checkpoint; + _currentCheckpoint = checkpoint; } } @@ -654,7 +659,7 @@ contract EigenPod is return sha256(abi.encodePacked(validatorPubkey, bytes16(0))); } - /// @dev Calculates the delta between two Gwei amounts, converts to Wei, and returns as an int256 + /// @dev Calculates the delta between two Gwei amounts and returns as an int256 function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int256) { return int256(uint256(newAmountGwei)) - int256(uint256(previousAmountGwei)); @@ -677,9 +682,14 @@ contract EigenPod is return _validatorPubkeyHashToInfo[pubkeyHash].status; } - /// @notice Returns the validator status for a given validatorPubkey + /// @notice Returns the validator status for a given validatorPubkey function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS) { bytes32 validatorPubkeyHash = _calculateValidatorPubkeyHash(validatorPubkey); return _validatorPubkeyHashToInfo[validatorPubkeyHash].status; } + + /// @notice Returns the currently-active checkpoint + function currentCheckpoint() public view returns (Checkpoint memory) { + return _currentCheckpoint; + } } diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 41a2e3b24..71069af28 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -43,7 +43,7 @@ abstract contract EigenPodStorage is IEigenPod { uint64 public currentCheckpointTimestamp; /// @notice The current checkpoint, if there is one active - Checkpoint public currentCheckpoint; + Checkpoint internal _currentCheckpoint; /** * @dev This empty reserved space is put in place to allow future versions to add new diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol index e6e9f5785..57351f7ef 100644 --- a/src/test/mocks/EigenPodMock.sol +++ b/src/test/mocks/EigenPodMock.sol @@ -43,6 +43,30 @@ contract EigenPodMock is IEigenPod, Test { /// @notice This returns the status of a given validator function validatorStatus(bytes32 pubkeyHash) external view returns(VALIDATOR_STATUS) {} + /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals + function activeValidatorCount() external view returns (uint256) {} + + /// @notice The timestamp of the last checkpoint finalized + function lastCheckpointTimestamp() external view returns (uint64) {} + + /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint + function currentCheckpointTimestamp() external view returns (uint64) {} + + /// @notice Returns the currently-active checkpoint + function currentCheckpoint() external view returns (Checkpoint memory) {} + + function startCheckpoint(bool revertIfNoBalance) external {} + + function verifyCheckpointProofs( + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceProof[] calldata proofs + ) external {} + + function verifyStaleBalance( + uint64 beaconTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.ValidatorProof calldata proof + ) external {} function verifyWithdrawalCredentials( uint64 oracleTimestamp, From f934bc061f068e823fecf86be64d9db27b6dc5c1 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 15 May 2024 20:24:11 +0000 Subject: [PATCH 10/85] feat: skip validator if already checkpointed * fix: finish rebase * chore: make bindings --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- .../DelayedWithdrawalRouter/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EIP1271SignatureUtils/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 1111 ++++---- pkg/bindings/EigenPodManager/binding.go | 111 +- .../EigenPodManagerStorage/binding.go | 85 +- pkg/bindings/EigenPodStorage/binding.go | 2239 +++++++++++++++++ pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/IEigenPod/binding.go | 1018 +++++--- pkg/bindings/IEigenPodManager/binding.go | 85 +- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/Pausable/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- pkg/bindings/StructuredLinkedList/binding.go | 2 +- .../EigenPod_Minor_Upgrade_Deploy.s.sol | 12 +- script/utils/ExistingDeploymentParser.sol | 13 - src/contracts/pods/EigenPod.sol | 34 +- src/test/EigenPod.t.sol | 112 +- 28 files changed, 3582 insertions(+), 1274 deletions(-) create mode 100644 pkg/bindings/EigenPodStorage/binding.go diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 0f363f0a3..4fb364c94 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220b6fe65fd22c565618762f1cf51b51d3e9474528dd8c72aa59d5bf72e7ee9a7b864736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212209b0eed3b73b412fd7522d30a39745bcccb6f8ab5a178f58bee49481f317bcd9564736f6c634300080c0033", } // AVSDirectoryABI 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 2ed34f20f..1efa2af77 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002b4438038062002b44833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516129c76200017d6000396000818161056f01528181610c5b01528181610c8601528181610cb10152610cd201526129c76000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146104ff578063eb415f4514610512578063f1127ed81461051a578063f2fde38b14610557578063fdc371ce1461056a57600080fd5b8063b8c25594146104b3578063c3cda520146104c6578063c4d66de8146104d9578063d505accf146104ec57600080fd5b806395d89b41116100f457806395d89b41146104685780639ab24eb0146104705780639aec4bae14610483578063a457c2d71461048d578063a9059cbb146104a057600080fd5b806384b0196e1461040a5780638da5cb5b146104255780638e539e8c1461043657806391ddadf41461044957600080fd5b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461037a57806370a08231146103a2578063715018a6146103cb57806378aa33ba146103d35780637ecebe00146103f757600080fd5b80633a46b1a8146102e65780634bf5d7e9146102f9578063587cde1e146103235780635c19a95c1461036757600080fd5b80631ffacdef116101ef5780631ffacdef1461029457806323b872dd146102a9578063313ce567146102bc5780633644e515146102cb57806339509351146102d357600080fd5b80630455e6941461022157806306fdde031461025a578063095ea7b31461026f57806318160ddd14610282575b600080fd5b61024561022f366004612548565b6101316020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610262610591565b60405161025191906125b0565b61024561027d3660046125c3565b610623565b6067545b604051908152602001610251565b6102a76102a23660046125ed565b61063b565b005b6102456102b7366004612629565b610651565b60405160128152602001610251565b610286610675565b6102456102e13660046125c3565b610684565b6102866102f43660046125c3565b6106a6565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610262565b61034f610331366004612548565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610251565b6102a7610375366004612548565b610730565b61038d610388366004612548565b61073d565b60405163ffffffff9091168152602001610251565b6102866103b0366004612548565b6001600160a01b031660009081526065602052604090205490565b6102a7610765565b6102456103e1366004612548565b6101326020526000908152604090205460ff1681565b610286610405366004612548565b610779565b610412610797565b6040516102519796959493929190612665565b6033546001600160a01b031661034f565b6102866104443660046126fb565b610835565b61045161089d565b60405165ffffffffffff9091168152602001610251565b6102626108a8565b61028661047e366004612548565b6108b7565b6102866101305481565b61024561049b3660046125c3565b610939565b6102456104ae3660046125c3565b6109b4565b6102a76104c13660046125ed565b6109c2565b6102a76104d4366004612725565b6109d4565b6102a76104e7366004612548565b610b0a565b6102a76104fa36600461277d565b610dc9565b61028661050d3660046127e7565b610f2d565b6102a7610f58565b61052d61052836600461281a565b611028565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610251565b6102a7610565366004612548565b6110ac565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b6060606880546105a09061284f565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061284f565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600033610631818585611122565b5060019392505050565b610643611246565b61064d82826112a0565b5050565b60003361065f858285611301565b61066a85858561137b565b506001949350505050565b600061067f611537565b905090565b6000336106318185856106978383610f2d565b6106a1919061289a565b611122565b60006106b061089d565b65ffffffffffff1682106107075760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260ff602052604090206107299083611541565b9392505050565b61073a338261162a565b50565b6001600160a01b038116600090815260ff602052604081205461075f906116a4565b92915050565b61076d611246565b610777600061170d565b565b6001600160a01b038116600090815260cb602052604081205461075f565b6000606080600080600060606097546000801b1480156107b75750609854155b6107fb5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016106fe565b61080361175f565b61080b61176e565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083f61089d565b65ffffffffffff1682106108915760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016106fe565b61075f61010083611541565b600061067f4261177d565b6060606980546105a09061284f565b6001600160a01b038116600090815260ff60205260408120548015610926576001600160a01b038316600090815260ff6020526040902080546000198301908110610904576109046128b2565b60009182526020909120015464010000000090046001600160e01b0316610929565b60005b6001600160e01b03169392505050565b600033816109478286610f2d565b9050838110156109a75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106fe565b61066a8286868403611122565b60003361063181858561137b565b6109ca611246565b61064d82826117e4565b83421115610a245760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016106fe565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610a9e90610a969060a0016040516020818303038152906040528051906020012061183d565b85858561186a565b9050610aa981611892565b8614610af75760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016106fe565b610b01818861162a565b50505050505050565b600054610100900460ff1615808015610b2a5750600054600160ff909116105b80610b445750303b158015610b44575060005460ff166001145b610ba75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106fe565b6000805460ff191660011790558015610bca576000805461ff0019166101001790555b610bd26118ba565b610c1f6040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b8152506118e9565b610c288261170d565b610c4f604051806040016040528060068152602001653122a4a3a2a760d11b81525061191a565b60001961013055610c817f000000000000000000000000000000000000000000000000000000000000000060016112a0565b610cac7f000000000000000000000000000000000000000000000000000000000000000060016117e4565b610d577f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5291906128c8565b611964565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2690600090a1801561064d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610e195760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106fe565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e488c611892565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ea38261183d565b90506000610eb38287878761186a565b9050896001600160a01b0316816001600160a01b031614610f165760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106fe565b610f218a8a8a611122565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610f60611246565b6000196101305414610ff75760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a4016106fe565b60006101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061106c5761106c6128b2565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6110b4611246565b6001600160a01b0381166111195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fe565b61073a8161170d565b6001600160a01b0383166111845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106fe565b6001600160a01b0382166111e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106fe565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146107775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fe565b6001600160a01b03821660008181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b600061130d8484610f2d565b9050600019811461137557818110156113685760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106fe565b6113758484848403611122565b50505050565b6001600160a01b0383166113df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106fe565b6001600160a01b0382166114415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106fe565b61144c8383836119ef565b6001600160a01b038316600090815260656020526040902054818110156114c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106fe565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115249086815260200190565b60405180910390a3611375848484611acd565b600061067f611aff565b81546000908181600581111561159b57600061155c84611b73565b61156690856128e1565b600088815260209020909150869082015463ffffffff16111561158b57809150611599565b61159681600161289a565b92505b505b808210156115e85760006115af8383611c58565b600088815260209020909150869082015463ffffffff1611156115d4578091506115e2565b6115df81600161289a565b92505b5061159b565b8015611614576000868152602090208101600019015464010000000090046001600160e01b0316611617565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611375828483611c73565b600063ffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016106fe565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546105a09061284f565b6060609a80546105a09061284f565b600065ffffffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016106fe565b6001600160a01b03821660008181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016112f5565b600061075f61184a611537565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061187b87878787611db0565b9150915061188881611e74565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b600054610100900460ff166118e15760405162461bcd60e51b81526004016106fe906128f8565b610777611fc2565b600054610100900460ff166119105760405162461bcd60e51b81526004016106fe906128f8565b61064d8282611ff2565b600054610100900460ff166119415760405162461bcd60e51b81526004016106fe906128f8565b61073a81604051806040016040528060018152602001603160f81b815250612040565b61196e828261209d565b6067546001600160e01b0310156119e05760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016106fe565b6113756101006121728361217e565b610130544211611ac8576001600160a01b0383166000908152610131602052604090205460ff1680611a3a57506001600160a01b0382166000908152610132602052604090205460ff165b80611a4c57506001600160a01b038316155b611ac85760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a4016106fe565b505050565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054611ac892918216911683611c73565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611b2a6122f3565b611b3261234c565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600081611b8257506000919050565b60006001611b8f8461237d565b901c6001901b90506001818481611ba857611ba8612943565b048201901c90506001818481611bc057611bc0612943565b048201901c90506001818481611bd857611bd8612943565b048201901c90506001818481611bf057611bf0612943565b048201901c90506001818481611c0857611c08612943565b048201901c90506001818481611c2057611c20612943565b048201901c90506001818481611c3857611c38612943565b048201901c905061072981828581611c5257611c52612943565b04612411565b6000611c676002848418612959565b6107299084841661289a565b816001600160a01b0316836001600160a01b031614158015611c955750600081115b15611ac8576001600160a01b03831615611d23576001600160a01b038316600090815260ff602052604081208190611cd0906124278561217e565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d18929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611ac8576001600160a01b038216600090815260ff602052604081208190611d59906121728561217e565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611da1929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611de75750600090506003611e6b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e6457600060019250925050611e6b565b9150600090505b94509492505050565b6000816004811115611e8857611e8861297b565b1415611e915750565b6001816004811115611ea557611ea561297b565b1415611ef35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106fe565b6002816004811115611f0757611f0761297b565b1415611f555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106fe565b6003816004811115611f6957611f6961297b565b141561073a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106fe565b600054610100900460ff16611fe95760405162461bcd60e51b81526004016106fe906128f8565b6107773361170d565b600054610100900460ff166120195760405162461bcd60e51b81526004016106fe906128f8565b815161202c90606890602085019061249c565b508051611ac890606990602084019061249c565b600054610100900460ff166120675760405162461bcd60e51b81526004016106fe906128f8565b815161207a90609990602085019061249c565b50805161208e90609a90602084019061249c565b50506000609781905560985550565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106fe565b6120ff600083836119ef565b8060676000828254612111919061289a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361064d60008383611acd565b6000610729828461289a565b825460009081908181156121cb5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b031660208201526121e0565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061220084868863ffffffff16565b925060008211801561222a575061221561089d565b65ffffffffffff16816000015163ffffffff16145b1561226f5761223883612433565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff9092169190911790556122e9565b86604051806040016040528061229361228661089d565b65ffffffffffff166116a4565b63ffffffff1681526020016122a786612433565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000806122fe61175f565b805190915015612315578051602090910120919050565b60975480156123245792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b60008061235761176e565b80519091501561236e578051602090910120919050565b60985480156123245792915050565b600080608083901c1561239257608092831c92015b604083901c156123a457604092831c92015b602083901c156123b657602092831c92015b601083901c156123c857601092831c92015b600883901c156123da57600892831c92015b600483901c156123ec57600492831c92015b600283901c156123fe57600292831c92015b600183901c1561075f5760010192915050565b60008183106124205781610729565b5090919050565b600061072982846128e1565b60006001600160e01b038211156117095760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016106fe565b8280546124a89061284f565b90600052602060002090601f0160209004810192826124ca5760008555612510565b82601f106124e357805160ff1916838001178555612510565b82800160010185558215612510579182015b828111156125105782518255916020019190600101906124f5565b506117099291505b808211156117095760008155600101612518565b80356001600160a01b038116811461254357600080fd5b919050565b60006020828403121561255a57600080fd5b6107298261252c565b6000815180845260005b818110156125895760208185018101518683018201520161256d565b8181111561259b576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006107296020830184612563565b600080604083850312156125d657600080fd5b6125df8361252c565b946020939093013593505050565b6000806040838503121561260057600080fd5b6126098361252c565b91506020830135801515811461261e57600080fd5b809150509250929050565b60008060006060848603121561263e57600080fd5b6126478461252c565b92506126556020850161252c565b9150604084013590509250925092565b60ff60f81b881681526000602060e08184015261268560e084018a612563565b8381036040850152612697818a612563565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156126e9578351835292840192918401916001016126cd565b50909c9b505050505050505050505050565b60006020828403121561270d57600080fd5b5035919050565b803560ff8116811461254357600080fd5b60008060008060008060c0878903121561273e57600080fd5b6127478761252c565b9550602087013594506040870135935061276360608801612714565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561279857600080fd5b6127a18861252c565b96506127af6020890161252c565b955060408801359450606088013593506127cb60808901612714565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156127fa57600080fd5b6128038361252c565b91506128116020840161252c565b90509250929050565b6000806040838503121561282d57600080fd5b6128368361252c565b9150602083013563ffffffff8116811461261e57600080fd5b600181811c9082168061286357607f821691505b602082108114156118b457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156128ad576128ad612884565b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128da57600080fd5b5051919050565b6000828210156128f3576128f3612884565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261297657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220efc3f106504e0c28cb8cafc81d7a3da2bf482a3d97d965d614af2702bacb7b2e64736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b50604051620054f6380380620054f68339818101604052810190620000379190620001c6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200007b6200008260201b60201c565b50620002dc565b600060019054906101000a900460ff1615620000d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cc906200027f565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff1614620001465760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013d9190620002bf565b60405180910390a15b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200017a826200014d565b9050919050565b60006200018e826200016d565b9050919050565b620001a08162000181565b8114620001ac57600080fd5b50565b600081519050620001c08162000195565b92915050565b600060208284031215620001df57620001de62000148565b5b6000620001ef84828501620001af565b91505092915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b600062000267602783620001f8565b9150620002748262000209565b604082019050919050565b600060208201905081810360008301526200029a8162000258565b9050919050565b600060ff82169050919050565b620002b981620002a1565b82525050565b6000602082019050620002d66000830184620002ae565b92915050565b6080516151e262000314600039600081816111fc015281816112270152818161125201528181611273015261179101526151e26000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146106a5578063eb415f45146106d5578063f1127ed8146106df578063f2fde38b1461070f578063fdc371ce1461072b5761021c565b8063b8c2559414610635578063c3cda52014610651578063c4d66de81461066d578063d505accf146106895761021c565b806395d89b41116100f457806395d89b41146105695780639ab24eb0146105875780639aec4bae146105b7578063a457c2d7146105d5578063a9059cbb146106055761021c565b806384b0196e146104d95780638da5cb5b146104fd5780638e539e8c1461051b57806391ddadf41461054b5761021c565b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461040f57806370a082311461043f578063715018a61461046f57806378aa33ba146104795780637ecebe00146104a95761021c565b80633a46b1a8146103755780634bf5d7e9146103a5578063587cde1e146103c35780635c19a95c146103f35761021c565b80631ffacdef116101ef5780631ffacdef146102bd57806323b872dd146102d9578063313ce567146103095780633644e5151461032757806339509351146103455761021c565b80630455e6941461022157806306fdde0314610251578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61023b60048036038101906102369190613727565b610749565b604051610248919061376f565b60405180910390f35b61025961076a565b6040516102669190613823565b60405180910390f35b6102896004803603810190610284919061387b565b6107fc565b604051610296919061376f565b60405180910390f35b6102a761081f565b6040516102b491906138ca565b60405180910390f35b6102d760048036038101906102d29190613911565b610829565b005b6102f360048036038101906102ee9190613951565b61083f565b604051610300919061376f565b60405180910390f35b61031161086e565b60405161031e91906139c0565b60405180910390f35b61032f610877565b60405161033c91906139f4565b60405180910390f35b61035f600480360381019061035a919061387b565b610886565b60405161036c919061376f565b60405180910390f35b61038f600480360381019061038a919061387b565b6108bd565b60405161039c91906138ca565b60405180910390f35b6103ad610960565b6040516103ba9190613823565b60405180910390f35b6103dd60048036038101906103d89190613727565b61099d565b6040516103ea9190613a1e565b60405180910390f35b61040d60048036038101906104089190613727565b610a06565b005b61042960048036038101906104249190613727565b610a1a565b6040516104369190613a58565b60405180910390f35b61045960048036038101906104549190613727565b610a6e565b60405161046691906138ca565b60405180910390f35b610477610ab7565b005b610493600480360381019061048e9190613727565b610acb565b6040516104a0919061376f565b60405180910390f35b6104c360048036038101906104be9190613727565b610aec565b6040516104d091906138ca565b60405180910390f35b6104e1610b3c565b6040516104f49796959493929190613b6c565b60405180910390f35b610505610c3d565b6040516105129190613a1e565b60405180910390f35b61053560048036038101906105309190613bf0565b610c67565b60405161054291906138ca565b60405180910390f35b610553610ccd565b6040516105609190613c3e565b60405180910390f35b610571610cdd565b60405161057e9190613823565b60405180910390f35b6105a1600480360381019061059c9190613727565b610d6f565b6040516105ae91906138ca565b60405180910390f35b6105bf610e77565b6040516105cc91906138ca565b60405180910390f35b6105ef60048036038101906105ea919061387b565b610e7e565b6040516105fc919061376f565b60405180910390f35b61061f600480360381019061061a919061387b565b610ef5565b60405161062c919061376f565b60405180910390f35b61064f600480360381019061064a9190613911565b610f18565b005b61066b60048036038101906106669190613cb1565b610f2e565b005b61068760048036038101906106829190613727565b611032565b005b6106a3600480360381019061069e9190613d3e565b61138e565b005b6106bf60048036038101906106ba9190613de0565b6114d0565b6040516106cc91906138ca565b60405180910390f35b6106dd611557565b005b6106f960048036038101906106f49190613e4c565b6115fb565b6040516107069190613f01565b60405180910390f35b61072960048036038101906107249190613727565b61170b565b005b61073361178f565b6040516107409190613f7b565b60405180910390f35b6101316020528060005260406000206000915054906101000a900460ff1681565b60606068805461077990613fc5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a590613fc5565b80156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b5050505050905090565b6000806108076117b3565b90506108148185856117bb565b600191505092915050565b6000606754905090565b610831611986565b61083b8282611a04565b5050565b60008061084a6117b3565b9050610857858285611aae565b610862858585611b3a565b60019150509392505050565b60006012905090565b6000610881611db5565b905090565b6000806108916117b3565b90506108b28185856108a385896114d0565b6108ad9190614026565b6117bb565b600191505092915050565b60006108c7610ccd565b65ffffffffffff168210610910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610907906140c8565b60405180910390fd5b61095860ff60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611dc4565b905092915050565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a17610a116117b3565b82611f0c565b50565b6000610a6760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612026565b9050919050565b6000606560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610abf611986565b610ac96000612079565b565b6101326020528060005260406000206000915054906101000a900460ff1681565b6000610b3560cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061213f565b9050919050565b6000606080600080600060606000801b609754148015610b6057506000801b609854145b610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690614134565b60405180910390fd5b610ba761214d565b610baf6121df565b46306000801b600067ffffffffffffffff811115610bd057610bcf614154565b5b604051908082528060200260200182016040528015610bfe5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c71610ccd565b65ffffffffffff168210610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb1906140c8565b60405180910390fd5b610cc661010083611dc4565b9050919050565b6000610cd842612271565b905090565b606060698054610cec90613fc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1890613fc5565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b5050505050905090565b60008060ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610e4e5760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110610e1357610e12614183565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e51565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101305481565b600080610e896117b3565b90506000610e9782866114d0565b905083811015610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390614224565b60405180910390fd5b610ee982868684036117bb565b60019250505092915050565b600080610f006117b3565b9050610f0d818585611b3a565b600191505092915050565b610f20611986565b610f2a82826122c6565b5050565b83421115610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890614290565b60405180910390fd5b6000610fd3610fcb7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610fb094939291906142b0565b60405160208183030381529060405280519060200120612370565b85858561238a565b9050610fde816123b5565b861461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614341565b60405180910390fd5b6110298188611f0c565b50505050505050565b60008060019054906101000a900460ff161590508080156110635750600160008054906101000a900460ff1660ff16105b80611090575061107230612413565b15801561108f5750600160008054906101000a900460ff1660ff16145b5b6110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c6906143d3565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801561110c576001600060016101000a81548160ff0219169083151502179055505b611114612436565b6111886040518060400160405280600d81526020017f4261636b696e6720456967656e000000000000000000000000000000000000008152506040518060400160405280600681526020017f62454947454e000000000000000000000000000000000000000000000000000081525061248f565b61119182612079565b6111cf6040518060400160405280600681526020017f62454947454e00000000000000000000000000000000000000000000000000008152506124ec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610130819055506112227f00000000000000000000000000000000000000000000000000000000000000006001611a04565b61124d7f000000000000000000000000000000000000000000000000000000000000000060016122c6565b6113057f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190614408565b61257d565b7fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2660405160405180910390a1801561138a5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516113819190614470565b60405180910390a15b5050565b834211156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144d7565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886114008c6123b5565b89604051602001611416969594939291906144f7565b604051602081830303815290604052805190602001209050600061143982612370565b905060006114498287878761238a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906145a4565b60405180910390fd5b6114c48a8a8a6117bb565b50505050505050505050565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61155f611986565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61013054146115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb9061465c565b60405180910390fd5b6000610130819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b6116036135e3565b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff168154811061165a57611659614183565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611713611986565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906146ee565b60405180910390fd5b61178c81612079565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614780565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290614812565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161197991906138ca565b60405180910390a3505050565b61198e6117b3565b73ffffffffffffffffffffffffffffffffffffffff166119ac610c3d565b73ffffffffffffffffffffffffffffffffffffffff1614611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061487e565b60405180910390fd5b565b8061013160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051611aa2919061376f565b60405180910390a25050565b6000611aba84846114d0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b345781811015611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906148ea565b60405180910390fd5b611b3384848484036117bb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061497c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190614a0e565b60405180910390fd5b611c2583838361260b565b6000606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614aa0565b60405180910390fd5b818103606560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d9c91906138ca565b60405180910390a3611daf84848461273f565b50505050565b6000611dbf61276a565b905090565b600080838054905090506000808290506005831115611e3a576000611de8846127ce565b84611df39190614ac0565b905085611e0088836128c8565b60000160009054906101000a900463ffffffff1663ffffffff161115611e2857809150611e38565b600181611e359190614026565b92505b505b5b80821015611e9a576000611e4f83836128dd565b905085611e5c88836128c8565b60000160009054906101000a900463ffffffff1663ffffffff161115611e8457809150611e94565b600181611e919190614026565b92505b50611e3b565b60008114611ee057611eaf86600183036128c8565b60000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611ee3565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b6000611f178361099d565b90506000611f2484610a6e565b90508260fe60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612020828483612903565b50505050565b600063ffffffff8016821115612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890614b66565b60405180910390fd5b819050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b60606099805461215c90613fc5565b80601f016020809104026020016040519081016040528092919081815260200182805461218890613fc5565b80156121d55780601f106121aa576101008083540402835291602001916121d5565b820191906000526020600020905b8154815290600101906020018083116121b857829003601f168201915b5050505050905090565b6060609a80546121ee90613fc5565b80601f016020809104026020016040519081016040528092919081815260200182805461221a90613fc5565b80156122675780601f1061223c57610100808354040283529160200191612267565b820191906000526020600020905b81548152906001019060200180831161224a57829003601f168201915b5050505050905090565b600065ffffffffffff80168211156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614bf8565b60405180910390fd5b819050919050565b8061013260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b82604051612364919061376f565b60405180910390a25050565b600061238361237d611db5565b83612afc565b9050919050565b600080600061239b87878787612b3d565b915091506123a881612c20565b8192505050949350505050565b60008060cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506124028161213f565b915061240d81612d8e565b50919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614c8a565b60405180910390fd5b61248d612da4565b565b600060019054906101000a900460ff166124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614c8a565b60405180910390fd5b6124e88282612e05565b5050565b600060019054906101000a900460ff1661253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253290614c8a565b60405180910390fd5b61257a816040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612e86565b50565b6125878282612f1b565b61258f613073565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166125b561081f565b11156125f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ed90614d1c565b60405180910390fd5b612605610100613097836130ad565b50505050565b61013054421161272f5761013160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126b8575061013260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806126ef5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614dd4565b60405180910390fd5b5b61273a838383613388565b505050565b61274a83838361338d565b6127656127568461099d565b61275f8461099d565b83612903565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612795613392565b61279d6133fd565b46306040516020016127b3959493929190614df4565b60405160208183030381529060405280519060200120905090565b6000808214156127e157600090506128c3565b600060016127ee84613468565b901c6001901b9050600181848161280857612807614e47565b5b048201901c9050600181848161282157612820614e47565b5b048201901c9050600181848161283a57612839614e47565b5b048201901c9050600181848161285357612852614e47565b5b048201901c9050600181848161286c5761286b614e47565b5b048201901c9050600181848161288557612884614e47565b5b048201901c9050600181848161289e5761289d614e47565b5b048201901c90506128bf818285816128b9576128b8614e47565b5b04613549565b9150505b919050565b60008260005281602060002001905092915050565b600060028284186128ee9190614e76565b8284166128fb9190614026565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561293f5750600081115b15612af757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1d576000806129c660ff60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613562856130ad565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a12929190614ea7565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612af657600080612a9f60ff60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613097856130ad565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612aeb929190614ea7565b60405180910390a250505b5b505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b78576000600391509150612c17565b600060018787878760405160008152602001604052604051612b9d9493929190614ed0565b6020604051602081039080840390855afa158015612bbf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c0e57600060019250925050612c17565b80600092509250505b94509492505050565b60006004811115612c3457612c33614f15565b5b816004811115612c4757612c46614f15565b5b1415612c5257612d8b565b60016004811115612c6657612c65614f15565b5b816004811115612c7957612c78614f15565b5b1415612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb190614f90565b60405180910390fd5b60026004811115612cce57612ccd614f15565b5b816004811115612ce157612ce0614f15565b5b1415612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990614ffc565b60405180910390fd5b60036004811115612d3657612d35614f15565b5b816004811115612d4957612d48614f15565b5b1415612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d819061508e565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b600060019054906101000a900460ff16612df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dea90614c8a565b60405180910390fd5b612e03612dfe6117b3565b612079565b565b600060019054906101000a900460ff16612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90614c8a565b60405180910390fd5b8160689080519060200190612e6a929190613621565b508060699080519060200190612e81929190613621565b505050565b600060019054906101000a900460ff16612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614c8a565b60405180910390fd5b8160999080519060200190612eeb929190613621565b5080609a9080519060200190612f02929190613621565b506000801b6097819055506000801b6098819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f82906150fa565b60405180910390fd5b612f976000838361260b565b8060676000828254612fa99190614026565b9250508190555080606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161305b91906138ca565b60405180910390a361306f6000838361273f565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600081836130a59190614026565b905092915050565b6000806000858054905090506000808214613173576130cf87600184036128c8565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250506131af565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506131e484868863ffffffff16565b925060008211801561320e57506131f9610ccd565b65ffffffffffff16816000015163ffffffff16145b1561327f5761321c83613578565b61322988600185036128c8565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061337e565b8660405180604001604052806132a3613296610ccd565b65ffffffffffff16612026565b63ffffffff1681526020016132b786613578565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b505050565b505050565b60008061339d61214d565b90506000815111156133b95780805190602001209150506133fa565b600060975490506000801b81146133d45780925050506133fa565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b6000806134086121df565b9050600081511115613424578080519060200120915050613465565b600060985490506000801b811461343f578092505050613465565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080600090506000608084901c111561348a57608083901c92506080810190505b6000604084901c11156134a557604083901c92506040810190505b6000602084901c11156134c057602083901c92506020810190505b6000601084901c11156134db57601083901c92506010810190505b6000600884901c11156134f657600883901c92506008810190505b6000600484901c111561351157600483901c92506004810190505b6000600284901c111561352c57600283901c92506002810190505b6000600184901c1115613540576001810190505b80915050919050565b6000818310613558578161355a565b825b905092915050565b600081836135709190614ac0565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156135db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d29061518c565b60405180910390fd5b819050919050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b82805461362d90613fc5565b90600052602060002090601f01602090048101928261364f5760008555613696565b82601f1061366857805160ff1916838001178555613696565b82800160010185558215613696579182015b8281111561369557825182559160200191906001019061367a565b5b5090506136a391906136a7565b5090565b5b808211156136c05760008160009055506001016136a8565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f4826136c9565b9050919050565b613704816136e9565b811461370f57600080fd5b50565b600081359050613721816136fb565b92915050565b60006020828403121561373d5761373c6136c4565b5b600061374b84828501613712565b91505092915050565b60008115159050919050565b61376981613754565b82525050565b60006020820190506137846000830184613760565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137c45780820151818401526020810190506137a9565b838111156137d3576000848401525b50505050565b6000601f19601f8301169050919050565b60006137f58261378a565b6137ff8185613795565b935061380f8185602086016137a6565b613818816137d9565b840191505092915050565b6000602082019050818103600083015261383d81846137ea565b905092915050565b6000819050919050565b61385881613845565b811461386357600080fd5b50565b6000813590506138758161384f565b92915050565b60008060408385031215613892576138916136c4565b5b60006138a085828601613712565b92505060206138b185828601613866565b9150509250929050565b6138c481613845565b82525050565b60006020820190506138df60008301846138bb565b92915050565b6138ee81613754565b81146138f957600080fd5b50565b60008135905061390b816138e5565b92915050565b60008060408385031215613928576139276136c4565b5b600061393685828601613712565b9250506020613947858286016138fc565b9150509250929050565b60008060006060848603121561396a576139696136c4565b5b600061397886828701613712565b935050602061398986828701613712565b925050604061399a86828701613866565b9150509250925092565b600060ff82169050919050565b6139ba816139a4565b82525050565b60006020820190506139d560008301846139b1565b92915050565b6000819050919050565b6139ee816139db565b82525050565b6000602082019050613a0960008301846139e5565b92915050565b613a18816136e9565b82525050565b6000602082019050613a336000830184613a0f565b92915050565b600063ffffffff82169050919050565b613a5281613a39565b82525050565b6000602082019050613a6d6000830184613a49565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b613aa881613a73565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ae381613845565b82525050565b6000613af58383613ada565b60208301905092915050565b6000602082019050919050565b6000613b1982613aae565b613b238185613ab9565b9350613b2e83613aca565b8060005b83811015613b5f578151613b468882613ae9565b9750613b5183613b01565b925050600181019050613b32565b5085935050505092915050565b600060e082019050613b81600083018a613a9f565b8181036020830152613b9381896137ea565b90508181036040830152613ba781886137ea565b9050613bb660608301876138bb565b613bc36080830186613a0f565b613bd060a08301856139e5565b81810360c0830152613be28184613b0e565b905098975050505050505050565b600060208284031215613c0657613c056136c4565b5b6000613c1484828501613866565b91505092915050565b600065ffffffffffff82169050919050565b613c3881613c1d565b82525050565b6000602082019050613c536000830184613c2f565b92915050565b613c62816139a4565b8114613c6d57600080fd5b50565b600081359050613c7f81613c59565b92915050565b613c8e816139db565b8114613c9957600080fd5b50565b600081359050613cab81613c85565b92915050565b60008060008060008060c08789031215613cce57613ccd6136c4565b5b6000613cdc89828a01613712565b9650506020613ced89828a01613866565b9550506040613cfe89828a01613866565b9450506060613d0f89828a01613c70565b9350506080613d2089828a01613c9c565b92505060a0613d3189828a01613c9c565b9150509295509295509295565b600080600080600080600060e0888a031215613d5d57613d5c6136c4565b5b6000613d6b8a828b01613712565b9750506020613d7c8a828b01613712565b9650506040613d8d8a828b01613866565b9550506060613d9e8a828b01613866565b9450506080613daf8a828b01613c70565b93505060a0613dc08a828b01613c9c565b92505060c0613dd18a828b01613c9c565b91505092959891949750929550565b60008060408385031215613df757613df66136c4565b5b6000613e0585828601613712565b9250506020613e1685828601613712565b9150509250929050565b613e2981613a39565b8114613e3457600080fd5b50565b600081359050613e4681613e20565b92915050565b60008060408385031215613e6357613e626136c4565b5b6000613e7185828601613712565b9250506020613e8285828601613e37565b9150509250929050565b613e9581613a39565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b613ecc81613e9b565b82525050565b604082016000820151613ee86000850182613e8c565b506020820151613efb6020850182613ec3565b50505050565b6000604082019050613f166000830184613ed2565b92915050565b6000819050919050565b6000613f41613f3c613f37846136c9565b613f1c565b6136c9565b9050919050565b6000613f5382613f26565b9050919050565b6000613f6582613f48565b9050919050565b613f7581613f5a565b82525050565b6000602082019050613f906000830184613f6c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fdd57607f821691505b60208210811415613ff157613ff0613f96565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061403182613845565b915061403c83613845565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407157614070613ff7565b5b828201905092915050565b7f4552433230566f7465733a20667574757265206c6f6f6b757000000000000000600082015250565b60006140b2601983613795565b91506140bd8261407c565b602082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f4549503731323a20556e696e697469616c697a65640000000000000000000000600082015250565b600061411e601583613795565b9150614129826140e8565b602082019050919050565b6000602082019050818103600083015261414d81614111565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061420e602583613795565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b600061427a601d83613795565b915061428582614244565b602082019050919050565b600060208201905081810360008301526142a98161426d565b9050919050565b60006080820190506142c560008301876139e5565b6142d26020830186613a0f565b6142df60408301856138bb565b6142ec60608301846138bb565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b600061432b601983613795565b9150614336826142f5565b602082019050919050565b6000602082019050818103600083015261435a8161431e565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006143bd602e83613795565b91506143c882614361565b604082019050919050565b600060208201905081810360008301526143ec816143b0565b9050919050565b6000815190506144028161384f565b92915050565b60006020828403121561441e5761441d6136c4565b5b600061442c848285016143f3565b91505092915050565b6000819050919050565b600061445a61445561445084614435565b613f1c565b6139a4565b9050919050565b61446a8161443f565b82525050565b60006020820190506144856000830184614461565b92915050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b60006144c1601d83613795565b91506144cc8261448b565b602082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600060c08201905061450c60008301896139e5565b6145196020830188613a0f565b6145266040830187613a0f565b61453360608301866138bb565b61454060808301856138bb565b61454d60a08301846138bb565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061458e601e83613795565b915061459982614558565b602082019050919050565b600060208201905081810360008301526145bd81614581565b9050919050565b7f4261636b696e67456967656e2e64697361626c655472616e736665725265737460008201527f72696374696f6e733a207472616e73666572207265737472696374696f6e732060208201527f61726520616c72656164792064697361626c6564000000000000000000000000604082015250565b6000614646605483613795565b9150614651826145c4565b606082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146d8602683613795565b91506146e38261467c565b604082019050919050565b60006020820190508181036000830152614707816146cb565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061476a602483613795565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147fc602283613795565b9150614807826147a0565b604082019050919050565b6000602082019050818103600083015261482b816147ef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614868602083613795565b915061487382614832565b602082019050919050565b600060208201905081810360008301526148978161485b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148d4601d83613795565b91506148df8261489e565b602082019050919050565b60006020820190508181036000830152614903816148c7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614966602583613795565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149f8602383613795565b9150614a038261499c565b604082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614a8a602683613795565b9150614a9582614a2e565b604082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b6000614acb82613845565b9150614ad683613845565b925082821015614ae957614ae8613ff7565b5b828203905092915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000614b50602683613795565b9150614b5b82614af4565b604082019050919050565b60006020820190508181036000830152614b7f81614b43565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203460008201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b6000614be2602683613795565b9150614bed82614b86565b604082019050919050565b60006020820190508181036000830152614c1181614bd5565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614c74602b83613795565b9150614c7f82614c18565b604082019050919050565b60006020820190508181036000830152614ca381614c67565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000614d06603083613795565b9150614d1182614caa565b604082019050919050565b60006020820190508181036000830152614d3581614cf9565b9050919050565b7f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560008201527f723a2066726f6d206f7220746f206d7573742062652077686974656c6973746560208201527f6400000000000000000000000000000000000000000000000000000000000000604082015250565b6000614dbe604183613795565b9150614dc982614d3c565b606082019050919050565b60006020820190508181036000830152614ded81614db1565b9050919050565b600060a082019050614e0960008301886139e5565b614e1660208301876139e5565b614e2360408301866139e5565b614e3060608301856138bb565b614e3d6080830184613a0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e8182613845565b9150614e8c83613845565b925082614e9c57614e9b614e47565b5b828204905092915050565b6000604082019050614ebc60008301856138bb565b614ec960208301846138bb565b9392505050565b6000608082019050614ee560008301876139e5565b614ef260208301866139b1565b614eff60408301856139e5565b614f0c60608301846139e5565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614f7a601883613795565b9150614f8582614f44565b602082019050919050565b60006020820190508181036000830152614fa981614f6d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614fe6601f83613795565b9150614ff182614fb0565b602082019050919050565b6000602082019050818103600083015261501581614fd9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615078602283613795565b91506150838261501c565b604082019050919050565b600060208201905081810360008301526150a78161506b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006150e4601f83613795565b91506150ef826150ae565b602082019050919050565b60006020820190508181036000830152615113816150d7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615176602783613795565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b905091905056fea264697066735822122060db62da3a4a379851eab5944d0f153a00cbb25ad451a09efe4dd831c021f4e864736f6c634300080c0033", } // 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 0f8f5c9e0..3e17f63d9 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: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220bea2f52348b6bda7bbfbca3649be91b1f763f24ba018e69ebf3c13b059742dd964736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e2a5bafc2c049bb1a1c74ae5fd19ff521d07aea9dfe19f2603124edda3cb980c64736f6c634300080c0033", } // 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 7ba816ac7..cd39d2a6e 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: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209b60f9734813d3adba40c977a5c97c5a7fe877fca0f9071ac0cdc7fb4fbaf94764736f6c634300080c0033", + Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201adc8a413c11b386c94f26ec67ec0705a5183c0315dc152177969f46e95a590c64736f6c634300080c0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go index 86037df3f..77e2a1a57 100644 --- a/pkg/bindings/DelayedWithdrawalRouter/binding.go +++ b/pkg/bindings/DelayedWithdrawalRouter/binding.go @@ -44,7 +44,7 @@ type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { // DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. var DelayedWithdrawalRouterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122028400ef97671cd8f3a8d86dddbdcc1fc8ab700744bbac0756e7f50b59579574964736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220da1ffed298685352f743f6a75984650951cd450f564f6d466560f57e52a33df664736f6c634300080c0033", } // DelayedWithdrawalRouterABI 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 f7af680ba..29851cf05 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,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\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212206a92a06db4e11b485475e9da7fba46650c7b812ca7ce5210ab13db07030dec6064736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220434b321e808b0ac3be4ef6ae9d2b2ec3204bf89c40045d456b9cbe8b8f12c9f964736f6c634300080c0033", } // DelegationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EIP1271SignatureUtils/binding.go b/pkg/bindings/EIP1271SignatureUtils/binding.go index d5903bc37..d35557db4 100644 --- a/pkg/bindings/EIP1271SignatureUtils/binding.go +++ b/pkg/bindings/EIP1271SignatureUtils/binding.go @@ -32,7 +32,7 @@ var ( // EIP1271SignatureUtilsMetaData contains all meta data concerning the EIP1271SignatureUtils contract. var EIP1271SignatureUtilsMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209832fdd04d36d0bbe78b7b9457ca6759978d3e81a33602cb69f518c735ee384664736f6c634300080c0033", + Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206196d746b114be2540a34e44ab801584f797eebacbfc3a32974215e1078f947464736f6c634300080c0033", } // EIP1271SignatureUtilsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Eigen/binding.go b/pkg/bindings/Eigen/binding.go index 3000876ed..d62113167 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: "0x60a06040523480156200001157600080fd5b506040516200342538038062003425833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516132b66200016f6000396000818161034801528181611475015261156401526132b66000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146105c5578063de0e9a3e146105d8578063ea598cb0146105eb578063eb415f45146105fe578063f1127ed814610606578063f2fde38b1461064357600080fd5b8063a9059cbb14610566578063aad41a4114610579578063b8c255941461058c578063c3cda5201461059f578063d505accf146105b257600080fd5b806395d89b411161010a57806395d89b411461051b5780639ab24eb0146105235780639aec4bae14610536578063a457c2d714610540578063a7d1195d1461055357600080fd5b806381b971611461049c57806384b0196e146104bd5780638da5cb5b146104d85780638e539e8c146104e957806391ddadf4146104fc57600080fd5b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c146103f95780636fcfff451461040c57806370a0823114610434578063715018a61461045d57806378aa33ba146104655780637ecebe001461048957600080fd5b80633a46b1a8146103305780633f4da4c6146103435780634bf5d7e91461038257806353957125146103ac578063587cde1e146103cd57600080fd5b80631ffacdef116102265780631ffacdef146102e057806323b872dd146102f3578063313ce567146103065780633644e51514610315578063395093511461031d57600080fd5b80630455e6941461026357806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b600080fd5b610287610271366004612b8a565b6101336020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a4610656565b6040516102939190612bf2565b6102876102bf366004612c05565b6106e8565b6102cc610700565b005b6067545b604051908152602001610293565b6102cc6102ee366004612c3d565b61084b565b610287610301366004612c74565b6108b4565b60405160128152602001610293565b6102d26108d8565b61028761032b366004612c05565b6108e7565b6102d261033e366004612c05565b610909565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d26103ba366004612b8a565b6101306020526000908152604090205481565b61036a6103db366004612b8a565b6001600160a01b03908116600090815260fe60205260409020541690565b6102cc610407366004612b8a565b61098e565b61041f61041a366004612b8a565b61099b565b60405163ffffffff9091168152602001610293565b6102d2610442366004612b8a565b6001600160a01b031660009081526065602052604090205490565b6102cc6109c3565b610287610473366004612b8a565b6101346020526000908152604090205460ff1681565b6102d2610497366004612b8a565b6109d7565b6102d26104aa366004612b8a565b6101316020526000908152604090205481565b6104c56109f5565b6040516102939796959493929190612cb0565b6033546001600160a01b031661036a565b6102d26104f7366004612d46565b610a93565b610504610afb565b60405165ffffffffffff9091168152602001610293565b6102a4610b06565b6102d2610531366004612b8a565b610b15565b6102d26101325481565b61028761054e366004612c05565b610b97565b6102cc610561366004612e35565b610c12565b610287610574366004612c05565b61103f565b6102cc610587366004612f78565b61104d565b6102cc61059a366004612c3d565b611128565b6102cc6105ad366004612ff5565b611189565b6102cc6105c036600461304d565b6112bf565b6102d26105d33660046130b7565b611423565b6102cc6105e6366004612d46565b61144e565b6102cc6105f9366004612d46565b611542565b6102cc61163b565b6106196106143660046130ea565b611704565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610651366004612b8a565b611788565b6060606880546106659061311f565b80601f01602080910402602001604051908101604052809291908181526020018280546106919061311f565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b6000336106f68185856117fe565b5060019392505050565b336000908152610131602052604090205461077a5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b336000908152610130602052604090205442116107f35760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610771565b336000818152610131602052604081208054919055906108139082611922565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b6108536119b3565b6001600160a01b03821660008181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b6000336108c2858285611a0d565b6108cd858585611a81565b506001949350505050565b60006108e2611c3d565b905090565b6000336106f68185856108fa8383611423565b610904919061316a565b6117fe565b6000610913610afb565b65ffffffffffff1682106109655760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6001600160a01b038316600090815260ff602052604090206109879083611c47565b9392505050565b6109983382611d30565b50565b6001600160a01b038116600090815260ff60205260408120546109bd90611daa565b92915050565b6109cb6119b3565b6109d56000611e13565b565b6001600160a01b038116600090815260cb60205260408120546109bd565b6000606080600080600060606097546000801b148015610a155750609854155b610a595760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610771565b610a61611e65565b610a69611e74565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610a9d610afb565b65ffffffffffff168210610aef5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6109bd61010083611c47565b60006108e242611e83565b6060606980546106659061311f565b6001600160a01b038116600090815260ff60205260408120548015610b84576001600160a01b038316600090815260ff6020526040902080546000198301908110610b6257610b62613182565b60009182526020909120015464010000000090046001600160e01b0316610b87565b60005b6001600160e01b03169392505050565b60003381610ba58286611423565b905083811015610c055760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610771565b6108cd82868684036117fe565b600054610100900460ff1615808015610c325750600054600160ff909116105b80610c4c5750303b158015610c4c575060005460ff166001145b610caf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610771565b6000805460ff191660011790558015610cd2576000805461ff0019166101001790555b610cda611eea565b610d1e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f19565b610d2785611e13565b610d4d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f4e565b8251845114610dd45760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b8151845114610e5b5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b60005b8451811015610fea57838181518110610e7957610e79613182565b60200260200101516101316000878481518110610e9857610e98613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110610ed657610ed6613182565b60200260200101516101306000878481518110610ef557610ef5613182565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555060016101336000878481518110610f3a57610f3a613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110610f8b57610f8b613182565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051610fd0911515815260200190565b60405180910390a280610fe281613198565b915050610e5e565b50600019610132558015611038576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000336106f6818585611a81565b8281146110c25760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610771565b60005b8381101561103857611116338686848181106110e3576110e3613182565b90506020020160208101906110f89190612b8a565b85858581811061110a5761110a613182565b90506020020135611a81565b8061112081613198565b9150506110c5565b6111306119b3565b6001600160a01b03821660008181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016108a8565b834211156111d95760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610771565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906112539061124b9060a00160405160208183030381529060405280519060200120611f98565b858585611fc5565b905061125e81611fed565b86146112ac5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610771565b6112b68188611d30565b50505050505050565b8342111561130f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610771565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861133e8c611fed565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061139982611f98565b905060006113a982878787611fc5565b9050896001600160a01b0316816001600160a01b03161461140c5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610771565b6114178a8a8a6117fe565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b611459333083611a81565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea91906131b3565b6109985760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610771565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d991906131b3565b6116305760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610771565b610998303383611a81565b6116436119b3565b60001961013254146116d35760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610771565b60006101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061174857611748613182565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117906119b3565b6001600160a01b0381166117f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610771565b61099881611e13565b6001600160a01b0383166118605760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610771565b6001600160a01b0382166118c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610771565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b61192c8282612015565b6067546001600160e01b03101561199e5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610771565b6119ad6101006120ea836120f6565b50505050565b6033546001600160a01b031633146109d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610771565b6000611a198484611423565b905060001981146119ad5781811015611a745760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610771565b6119ad84848484036117fe565b6001600160a01b038316611ae55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610771565b6001600160a01b038216611b475760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610771565b611b5283838361226b565b6001600160a01b03831660009081526065602052604090205481811015611bca5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610771565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c2a9086815260200190565b60405180910390a36119ad848484612365565b60006108e2612397565b815460009081816005811115611ca1576000611c628461240b565b611c6c90856131d0565b600088815260209020909150869082015463ffffffff161115611c9157809150611c9f565b611c9c81600161316a565b92505b505b80821015611cee576000611cb583836124f0565b600088815260209020909150869082015463ffffffff161115611cda57809150611ce8565b611ce581600161316a565b92505b50611ca1565b8015611d1a576000868152602090208101600019015464010000000090046001600160e01b0316611d1d565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ad82848361250b565b600063ffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610771565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546106659061311f565b6060609a80546106659061311f565b600065ffffffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610771565b600054610100900460ff16611f115760405162461bcd60e51b8152600401610771906131e7565b6109d5612648565b600054610100900460ff16611f405760405162461bcd60e51b8152600401610771906131e7565b611f4a8282612678565b5050565b600054610100900460ff16611f755760405162461bcd60e51b8152600401610771906131e7565b61099881604051806040016040528060018152602001603160f81b8152506126c6565b60006109bd611fa5611c3d565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611fd687878787612723565b91509150611fe3816127e7565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6001600160a01b03821661206b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610771565b6120776000838361226b565b8060676000828254612089919061316a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f4a60008383612365565b6000610987828461316a565b825460009081908181156121435760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612158565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061217884868863ffffffff16565b92506000821180156121a2575061218d610afb565b65ffffffffffff16816000015163ffffffff16145b156121e7576121b083612935565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612261565b86604051806040016040528061220b6121fe610afb565b65ffffffffffff16611daa565b63ffffffff16815260200161221f86612935565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b610132544211612360576001600160a01b038316158061229357506001600160a01b03831630145b806122a657506001600160a01b03821630145b806122ca57506001600160a01b0383166000908152610133602052604090205460ff165b806122ee57506001600160a01b0382166000908152610134602052604090205460ff165b6123605760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610771565b505050565b6001600160a01b03838116600090815260fe60205260408082205485841683529120546123609291821691168361250b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123c261299e565b6123ca6129f7565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008161241a57506000919050565b6000600161242784612a28565b901c6001901b9050600181848161244057612440613232565b048201901c9050600181848161245857612458613232565b048201901c9050600181848161247057612470613232565b048201901c9050600181848161248857612488613232565b048201901c905060018184816124a0576124a0613232565b048201901c905060018184816124b8576124b8613232565b048201901c905060018184816124d0576124d0613232565b048201901c9050610987818285816124ea576124ea613232565b04612abc565b60006124ff6002848418613248565b6109879084841661316a565b816001600160a01b0316836001600160a01b03161415801561252d5750600081115b15612360576001600160a01b038316156125bb576001600160a01b038316600090815260ff60205260408120819061256890612ad2856120f6565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125b0929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612360576001600160a01b038216600090815260ff6020526040812081906125f1906120ea856120f6565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612639929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff1661266f5760405162461bcd60e51b8152600401610771906131e7565b6109d533611e13565b600054610100900460ff1661269f5760405162461bcd60e51b8152600401610771906131e7565b81516126b2906068906020850190612ade565b508051612360906069906020840190612ade565b600054610100900460ff166126ed5760405162461bcd60e51b8152600401610771906131e7565b8151612700906099906020850190612ade565b50805161271490609a906020840190612ade565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561275a57506000905060036127de565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127ae573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127d7576000600192509250506127de565b9150600090505b94509492505050565b60008160048111156127fb576127fb61326a565b14156128045750565b60018160048111156128185761281861326a565b14156128665760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610771565b600281600481111561287a5761287a61326a565b14156128c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610771565b60038160048111156128dc576128dc61326a565b14156109985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610771565b60006001600160e01b03821115611e0f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610771565b6000806129a9611e65565b8051909150156129c0578051602090910120919050565b60975480156129cf5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080612a02611e74565b805190915015612a19578051602090910120919050565b60985480156129cf5792915050565b600080608083901c15612a3d57608092831c92015b604083901c15612a4f57604092831c92015b602083901c15612a6157602092831c92015b601083901c15612a7357601092831c92015b600883901c15612a8557600892831c92015b600483901c15612a9757600492831c92015b600283901c15612aa957600292831c92015b600183901c156109bd5760010192915050565b6000818310612acb5781610987565b5090919050565b600061098782846131d0565b828054612aea9061311f565b90600052602060002090601f016020900481019282612b0c5760008555612b52565b82601f10612b2557805160ff1916838001178555612b52565b82800160010185558215612b52579182015b82811115612b52578251825591602001919060010190612b37565b50611e0f9291505b80821115611e0f5760008155600101612b5a565b80356001600160a01b0381168114612b8557600080fd5b919050565b600060208284031215612b9c57600080fd5b61098782612b6e565b6000815180845260005b81811015612bcb57602081850181015186830182015201612baf565b81811115612bdd576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006109876020830184612ba5565b60008060408385031215612c1857600080fd5b612c2183612b6e565b946020939093013593505050565b801515811461099857600080fd5b60008060408385031215612c5057600080fd5b612c5983612b6e565b91506020830135612c6981612c2f565b809150509250929050565b600080600060608486031215612c8957600080fd5b612c9284612b6e565b9250612ca060208501612b6e565b9150604084013590509250925092565b60ff60f81b881681526000602060e081840152612cd060e084018a612ba5565b8381036040850152612ce2818a612ba5565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612d3457835183529284019291840191600101612d18565b50909c9b505050505050505050505050565b600060208284031215612d5857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d9e57612d9e612d5f565b604052919050565b600067ffffffffffffffff821115612dc057612dc0612d5f565b5060051b60200190565b600082601f830112612ddb57600080fd5b81356020612df0612deb83612da6565b612d75565b82815260059290921b84018101918181019086841115612e0f57600080fd5b8286015b84811015612e2a5780358352918301918301612e13565b509695505050505050565b60008060008060808587031215612e4b57600080fd5b612e5485612b6e565b935060208086013567ffffffffffffffff80821115612e7257600080fd5b818801915088601f830112612e8657600080fd5b8135612e94612deb82612da6565b81815260059190911b8301840190848101908b831115612eb357600080fd5b938501935b82851015612ed857612ec985612b6e565b82529385019390850190612eb8565b975050506040880135925080831115612ef057600080fd5b612efc89848a01612dca565b94506060880135925080831115612f1257600080fd5b5050612f2087828801612dca565b91505092959194509250565b60008083601f840112612f3e57600080fd5b50813567ffffffffffffffff811115612f5657600080fd5b6020830191508360208260051b8501011115612f7157600080fd5b9250929050565b60008060008060408587031215612f8e57600080fd5b843567ffffffffffffffff80821115612fa657600080fd5b612fb288838901612f2c565b90965094506020870135915080821115612fcb57600080fd5b50612fd887828801612f2c565b95989497509550505050565b803560ff81168114612b8557600080fd5b60008060008060008060c0878903121561300e57600080fd5b61301787612b6e565b9550602087013594506040870135935061303360608801612fe4565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561306857600080fd5b61307188612b6e565b965061307f60208901612b6e565b9550604088013594506060880135935061309b60808901612fe4565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156130ca57600080fd5b6130d383612b6e565b91506130e160208401612b6e565b90509250929050565b600080604083850312156130fd57600080fd5b61310683612b6e565b9150602083013563ffffffff81168114612c6957600080fd5b600181811c9082168061313357607f821691505b6020821081141561200f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561317d5761317d613154565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156131ac576131ac613154565b5060010190565b6000602082840312156131c557600080fd5b815161098781612c2f565b6000828210156131e2576131e2613154565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261326557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220157f2ca25e510bd4fd72de78a17088fba90e2f64b3d97431afd1978ac5933b9664736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b50604051620064cc380380620064cc8339818101604052810190620000379190620001c6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200007b6200008260201b60201c565b50620002dc565b600060019054906101000a900460ff1615620000d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cc906200027f565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff1614620001465760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013d9190620002bf565b60405180910390a15b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200017a826200014d565b9050919050565b60006200018e826200016d565b9050919050565b620001a08162000181565b8114620001ac57600080fd5b50565b600081519050620001c08162000195565b92915050565b600060208284031215620001df57620001de62000148565b5b6000620001ef84828501620001af565b91505092915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b600062000267602783620001f8565b9150620002748262000209565b604082019050919050565b600060208201905081810360008301526200029a8162000258565b9050919050565b600060ff82169050919050565b620002b981620002a1565b82525050565b6000602082019050620002d66000830184620002ae565b92915050565b6080516161c66200030660003960008181610ce901528181611bd70152611cb701526161c66000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e1461078b578063de0e9a3e146107bb578063ea598cb0146107d7578063eb415f45146107f3578063f1127ed8146107fd578063f2fde38b1461082d5761025e565b8063a9059cbb146106eb578063aad41a411461071b578063b8c2559414610737578063c3cda52014610753578063d505accf1461076f5761025e565b806395d89b411161010a57806395d89b41146106335780639ab24eb0146106515780639aec4bae14610681578063a457c2d71461069f578063a7d1195d146106cf5761025e565b806381b971611461057357806384b0196e146105a35780638da5cb5b146105c75780638e539e8c146105e557806391ddadf4146106155761025e565b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c1461048d5780636fcfff45146104a957806370a08231146104d9578063715018a61461050957806378aa33ba146105135780637ecebe00146105435761025e565b80633a46b1a8146103c15780633f4da4c6146103f15780634bf5d7e91461040f578063539571251461042d578063587cde1e1461045d5761025e565b80631ffacdef116102265780631ffacdef1461030957806323b872dd14610325578063313ce567146103555780633644e5151461037357806339509351146103915761025e565b80630455e6941461026357806306fdde0314610293578063095ea7b3146102b15780631249c58b146102e157806318160ddd146102eb575b600080fd5b61027d60048036038101906102789190613e75565b610849565b60405161028a9190613ebd565b60405180910390f35b61029b61086a565b6040516102a89190613f71565b60405180910390f35b6102cb60048036038101906102c69190613fc9565b6108fc565b6040516102d89190613ebd565b60405180910390f35b6102e961091f565b005b6102f3610b0a565b6040516103009190614018565b60405180910390f35b610323600480360381019061031e919061405f565b610b14565b005b61033f600480360381019061033a919061409f565b610bc6565b60405161034c9190613ebd565b60405180910390f35b61035d610bf5565b60405161036a919061410e565b60405180910390f35b61037b610bfe565b6040516103889190614142565b60405180910390f35b6103ab60048036038101906103a69190613fc9565b610c0d565b6040516103b89190613ebd565b60405180910390f35b6103db60048036038101906103d69190613fc9565b610c44565b6040516103e89190614018565b60405180910390f35b6103f9610ce7565b60405161040691906141bc565b60405180910390f35b610417610d0b565b6040516104249190613f71565b60405180910390f35b61044760048036038101906104429190613e75565b610d48565b6040516104549190614018565b60405180910390f35b61047760048036038101906104729190613e75565b610d61565b60405161048491906141e6565b60405180910390f35b6104a760048036038101906104a29190613e75565b610dca565b005b6104c360048036038101906104be9190613e75565b610dde565b6040516104d09190614220565b60405180910390f35b6104f360048036038101906104ee9190613e75565b610e32565b6040516105009190614018565b60405180910390f35b610511610e7b565b005b61052d60048036038101906105289190613e75565b610e8f565b60405161053a9190613ebd565b60405180910390f35b61055d60048036038101906105589190613e75565b610eb0565b60405161056a9190614018565b60405180910390f35b61058d60048036038101906105889190613e75565b610f00565b60405161059a9190614018565b60405180910390f35b6105ab610f19565b6040516105be9796959493929190614334565b60405180910390f35b6105cf61101a565b6040516105dc91906141e6565b60405180910390f35b6105ff60048036038101906105fa91906143b8565b611044565b60405161060c9190614018565b60405180910390f35b61061d6110aa565b60405161062a9190614406565b60405180910390f35b61063b6110ba565b6040516106489190613f71565b60405180910390f35b61066b60048036038101906106669190613e75565b61114c565b6040516106789190614018565b60405180910390f35b610689611254565b6040516106969190614018565b60405180910390f35b6106b960048036038101906106b49190613fc9565b61125b565b6040516106c69190613ebd565b60405180910390f35b6106e960048036038101906106e4919061462c565b6112d2565b005b61070560048036038101906107009190613fc9565b61176d565b6040516107129190613ebd565b60405180910390f35b61073560048036038101906107309190614798565b611790565b005b610751600480360381019061074c919061405f565b61184b565b005b61076d60048036038101906107689190614871565b6118fd565b005b610789600480360381019061078491906148fe565b611a01565b005b6107a560048036038101906107a091906149a0565b611b43565b6040516107b29190614018565b60405180910390f35b6107d560048036038101906107d091906143b8565b611bca565b005b6107f160048036038101906107ec91906143b8565b611cb5565b005b6107fb611da2565b005b61081760048036038101906108129190614a0c565b611e46565b6040516108249190614ac1565b60405180910390f35b61084760048036038101906108429190613e75565b611f56565b005b6101336020528060005260406000206000915054906101000a900460ff1681565b60606068805461087990614b0b565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590614b0b565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600080610907611fda565b9050610914818585611fe2565b600191505092915050565b600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990614baf565b60405180910390fd5b61013060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b90614c41565b60405180910390fd5b600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ab933826121ad565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610aff9190614018565b60405180910390a250565b6000606754905090565b610b1c61223b565b8061013360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051610bba9190613ebd565b60405180910390a25050565b600080610bd1611fda565b9050610bde8582856122b9565b610be9858585612345565b60019150509392505050565b60006012905090565b6000610c086125c0565b905090565b600080610c18611fda565b9050610c39818585610c2a8589611b43565b610c349190614c90565b611fe2565b600191505092915050565b6000610c4e6110aa565b65ffffffffffff168210610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614d32565b60405180910390fd5b610cdf60ff60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836125cf565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b6101306020528060005260406000206000915090505481565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610ddb610dd5611fda565b82612717565b50565b6000610e2b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612831565b9050919050565b6000606560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e8361223b565b610e8d6000612884565b565b6101346020528060005260406000206000915054906101000a900460ff1681565b6000610ef960cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061294a565b9050919050565b6101316020528060005260406000206000915090505481565b6000606080600080600060606000801b609754148015610f3d57506000801b609854145b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390614d9e565b60405180910390fd5b610f84612958565b610f8c6129ea565b46306000801b600067ffffffffffffffff811115610fad57610fac614426565b5b604051908082528060200260200182016040528015610fdb5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061104e6110aa565b65ffffffffffff168210611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90614d32565b60405180910390fd5b6110a3610100836125cf565b9050919050565b60006110b542612a7c565b905090565b6060606980546110c990614b0b565b80601f01602080910402602001604051908101604052809291908181526020018280546110f590614b0b565b80156111425780601f1061111757610100808354040283529160200191611142565b820191906000526020600020905b81548152906001019060200180831161112557829003601f168201915b5050505050905090565b60008060ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506000811461122b5760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018203815481106111f0576111ef614dbe565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661122e565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101325481565b600080611266611fda565b905060006112748286611b43565b9050838110156112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614e5f565b60405180910390fd5b6112c68286868403611fe2565b60019250505092915050565b60008060019054906101000a900460ff161590508080156113035750600160008054906101000a900460ff1660ff16105b80611330575061131230612ad1565b15801561132f5750600160008054906101000a900460ff1660ff16145b5b61136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690614ef1565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156113ac576001600060016101000a81548160ff0219169083151502179055505b6113b4612af4565b6114286040518060400160405280600581526020017f456967656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b4d565b61143185612884565b61146f6040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612baa565b82518451146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614fa9565b60405180910390fd5b81518451146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90615061565b60405180910390fd5b60005b84518110156116e45783818151811061151657611515614dbe565b5b6020026020010151610131600087848151811061153657611535614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082818151811061158f5761158e614dbe565b5b602002602001015161013060008784815181106115af576115ae614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001610133600087848151811061160f5761160e614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555084818151811061167b5761167a614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227160016040516116c99190613ebd565b60405180910390a280806116dc90615081565b9150506114fa565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101328190555080156117665760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161175d9190615105565b60405180910390a15b5050505050565b600080611778611fda565b9050611785818585612345565b600191505092915050565b8181905084849050146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90615192565b60405180910390fd5b60005b8484905081101561184457611831338686848181106117fd576117fc614dbe565b5b90506020020160208101906118129190613e75565b85858581811061182557611824614dbe565b5b90506020020135612345565b808061183c90615081565b9150506117db565b5050505050565b61185361223b565b8061013460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516118f19190613ebd565b60405180910390a25050565b83421115611940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611937906151fe565b60405180910390fd5b60006119a261199a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161197f949392919061521e565b60405160208183030381529060405280519060200120612c3b565b858585612c55565b90506119ad81612c80565b86146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e5906152af565b60405180910390fd5b6119f88188612717565b50505050505050565b83421115611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b9061531b565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888611a738c612c80565b89604051602001611a899695949392919061533b565b6040516020818303038152906040528051906020012090506000611aac82612c3b565b90506000611abc82878787612c55565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b23906153e8565b60405180910390fd5b611b378a8a8a611fe2565b50505050505050505050565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611bd5333083612345565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611c30929190615408565b6020604051808303816000875af1158015611c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c739190615446565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906154e5565b60405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d1293929190615505565b6020604051808303816000875af1158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190615446565b611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b906155ae565b60405180910390fd5b611d9f303383612345565b50565b611daa61223b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101325414611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690615666565b60405180910390fd5b6000610132819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611e4e613d22565b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110611ea557611ea4614dbe565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611f5e61223b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc5906156f8565b60405180910390fd5b611fd781612884565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120499061578a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b99061581c565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121a09190614018565b60405180910390a3505050565b6121b78282612cde565b6121bf612e36565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166121e5610b0a565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906158ae565b60405180910390fd5b612235610100612e5a83612e70565b50505050565b612243611fda565b73ffffffffffffffffffffffffffffffffffffffff1661226161101a565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae9061591a565b60405180910390fd5b565b60006122c58484611b43565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461233f5781811015612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890615986565b60405180910390fd5b61233e8484848403611fe2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90615a18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90615aaa565b60405180910390fd5b61243083838361314b565b6000606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae90615b3c565b60405180910390fd5b818103606560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125a79190614018565b60405180910390a36125ba8484846132eb565b50505050565b60006125ca613316565b905090565b6000808380549050905060008082905060058311156126455760006125f38461337a565b846125fe9190615b5c565b90508561260b8883613474565b60000160009054906101000a900463ffffffff1663ffffffff16111561263357809150612643565b6001816126409190614c90565b92505b505b5b808210156126a557600061265a8383613489565b9050856126678883613474565b60000160009054906101000a900463ffffffff1663ffffffff16111561268f5780915061269f565b60018161269c9190614c90565b92505b50612646565b600081146126eb576126ba8660018303613474565b60000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126ee565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b600061272283610d61565b9050600061272f84610e32565b90508260fe60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461282b8284836134af565b50505050565b600063ffffffff801682111561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390615c02565b60405180910390fd5b819050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b60606099805461296790614b0b565b80601f016020809104026020016040519081016040528092919081815260200182805461299390614b0b565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b6060609a80546129f990614b0b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2590614b0b565b8015612a725780601f10612a4757610100808354040283529160200191612a72565b820191906000526020600020905b815481529060010190602001808311612a5557829003601f168201915b5050505050905090565b600065ffffffffffff8016821115612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090615c94565b60405180910390fd5b819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90615d26565b60405180910390fd5b612b4b6136a8565b565b600060019054906101000a900460ff16612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390615d26565b60405180910390fd5b612ba68282613709565b5050565b600060019054906101000a900460ff16612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090615d26565b60405180910390fd5b612c38816040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525061378a565b50565b6000612c4e612c486125c0565b8361381f565b9050919050565b6000806000612c6687878787613860565b91509150612c7381613943565b8192505050949350505050565b60008060cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612ccd8161294a565b9150612cd881613ab1565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590615d92565b60405180910390fd5b612d5a6000838361314b565b8060676000828254612d6c9190614c90565b9250508190555080606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e1e9190614018565b60405180910390a3612e32600083836132eb565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008183612e689190614c90565b905092915050565b6000806000858054905090506000808214612f3657612e928760018403613474565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612f72565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612fa784868863ffffffff16565b9250600082118015612fd15750612fbc6110aa565b65ffffffffffff16816000015163ffffffff16145b1561304257612fdf83613ac7565b612fec8860018503613474565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613141565b8660405180604001604052806130666130596110aa565b65ffffffffffff16612831565b63ffffffff16815260200161307a86613ac7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b6101325442116132db57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806131bb57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806131f157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80613246575061013360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061329b575061013460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d190615e24565b60405180910390fd5b5b6132e6838383613b32565b505050565b6132f6838383613b37565b61331161330284610d61565b61330b84610d61565b836134af565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613341613b3c565b613349613ba7565b463060405160200161335f959493929190615e44565b60405160208183030381529060405280519060200120905090565b60008082141561338d576000905061346f565b6000600161339a84613c12565b901c6001901b905060018184816133b4576133b3615e97565b5b048201901c905060018184816133cd576133cc615e97565b5b048201901c905060018184816133e6576133e5615e97565b5b048201901c905060018184816133ff576133fe615e97565b5b048201901c9050600181848161341857613417615e97565b5b048201901c9050600181848161343157613430615e97565b5b048201901c9050600181848161344a57613449615e97565b5b048201901c905061346b8182858161346557613464615e97565b5b04613cf3565b9150505b919050565b60008260005281602060002001905092915050565b6000600282841861349a9190615ec6565b8284166134a79190614c90565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156134eb5750600081115b156136a357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135c95760008061357260ff60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d0c85612e70565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516135be929190615ef7565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136a25760008061364b60ff60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e5a85612e70565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613697929190615ef7565b60405180910390a250505b5b505050565b600060019054906101000a900460ff166136f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ee90615d26565b60405180910390fd5b613707613702611fda565b612884565b565b600060019054906101000a900460ff16613758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374f90615d26565b60405180910390fd5b816068908051906020019061376e929190613d60565b508060699080519060200190613785929190613d60565b505050565b600060019054906101000a900460ff166137d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d090615d26565b60405180910390fd5b81609990805190602001906137ef929190613d60565b5080609a9080519060200190613806929190613d60565b506000801b6097819055506000801b6098819055505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561389b57600060039150915061393a565b6000600187878787604051600081526020016040526040516138c09493929190615f20565b6020604051602081039080840390855afa1580156138e2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139315760006001925092505061393a565b80600092509250505b94509492505050565b6000600481111561395757613956615f65565b5b81600481111561396a57613969615f65565b5b141561397557613aae565b6001600481111561398957613988615f65565b5b81600481111561399c5761399b615f65565b5b14156139dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d490615fe0565b60405180910390fd5b600260048111156139f1576139f0615f65565b5b816004811115613a0457613a03615f65565b5b1415613a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3c9061604c565b60405180910390fd5b60036004811115613a5957613a58615f65565b5b816004811115613a6c57613a6b615f65565b5b1415613aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa4906160de565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2190616170565b60405180910390fd5b819050919050565b505050565b505050565b600080613b47612958565b9050600081511115613b63578080519060200120915050613ba4565b600060975490506000801b8114613b7e578092505050613ba4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080613bb26129ea565b9050600081511115613bce578080519060200120915050613c0f565b600060985490506000801b8114613be9578092505050613c0f565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080600090506000608084901c1115613c3457608083901c92506080810190505b6000604084901c1115613c4f57604083901c92506040810190505b6000602084901c1115613c6a57602083901c92506020810190505b6000601084901c1115613c8557601083901c92506010810190505b6000600884901c1115613ca057600883901c92506008810190505b6000600484901c1115613cbb57600483901c92506004810190505b6000600284901c1115613cd657600283901c92506002810190505b6000600184901c1115613cea576001810190505b80915050919050565b6000818310613d025781613d04565b825b905092915050565b60008183613d1a9190615b5c565b905092915050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b828054613d6c90614b0b565b90600052602060002090601f016020900481019282613d8e5760008555613dd5565b82601f10613da757805160ff1916838001178555613dd5565b82800160010185558215613dd5579182015b82811115613dd4578251825591602001919060010190613db9565b5b509050613de29190613de6565b5090565b5b80821115613dff576000816000905550600101613de7565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4282613e17565b9050919050565b613e5281613e37565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613e0d565b5b6000613e9984828501613e60565b91505092915050565b60008115159050919050565b613eb781613ea2565b82525050565b6000602082019050613ed26000830184613eae565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f12578082015181840152602081019050613ef7565b83811115613f21576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f4382613ed8565b613f4d8185613ee3565b9350613f5d818560208601613ef4565b613f6681613f27565b840191505092915050565b60006020820190508181036000830152613f8b8184613f38565b905092915050565b6000819050919050565b613fa681613f93565b8114613fb157600080fd5b50565b600081359050613fc381613f9d565b92915050565b60008060408385031215613fe057613fdf613e0d565b5b6000613fee85828601613e60565b9250506020613fff85828601613fb4565b9150509250929050565b61401281613f93565b82525050565b600060208201905061402d6000830184614009565b92915050565b61403c81613ea2565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b6000806040838503121561407657614075613e0d565b5b600061408485828601613e60565b92505060206140958582860161404a565b9150509250929050565b6000806000606084860312156140b8576140b7613e0d565b5b60006140c686828701613e60565b93505060206140d786828701613e60565b92505060406140e886828701613fb4565b9150509250925092565b600060ff82169050919050565b614108816140f2565b82525050565b600060208201905061412360008301846140ff565b92915050565b6000819050919050565b61413c81614129565b82525050565b60006020820190506141576000830184614133565b92915050565b6000819050919050565b600061418261417d61417884613e17565b61415d565b613e17565b9050919050565b600061419482614167565b9050919050565b60006141a682614189565b9050919050565b6141b68161419b565b82525050565b60006020820190506141d160008301846141ad565b92915050565b6141e081613e37565b82525050565b60006020820190506141fb60008301846141d7565b92915050565b600063ffffffff82169050919050565b61421a81614201565b82525050565b60006020820190506142356000830184614211565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6142708161423b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142ab81613f93565b82525050565b60006142bd83836142a2565b60208301905092915050565b6000602082019050919050565b60006142e182614276565b6142eb8185614281565b93506142f683614292565b8060005b8381101561432757815161430e88826142b1565b9750614319836142c9565b9250506001810190506142fa565b5085935050505092915050565b600060e082019050614349600083018a614267565b818103602083015261435b8189613f38565b9050818103604083015261436f8188613f38565b905061437e6060830187614009565b61438b60808301866141d7565b61439860a0830185614133565b81810360c08301526143aa81846142d6565b905098975050505050505050565b6000602082840312156143ce576143cd613e0d565b5b60006143dc84828501613fb4565b91505092915050565b600065ffffffffffff82169050919050565b614400816143e5565b82525050565b600060208201905061441b60008301846143f7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61445e82613f27565b810181811067ffffffffffffffff8211171561447d5761447c614426565b5b80604052505050565b6000614490613e03565b905061449c8282614455565b919050565b600067ffffffffffffffff8211156144bc576144bb614426565b5b602082029050602081019050919050565b600080fd5b60006144e56144e0846144a1565b614486565b90508083825260208201905060208402830185811115614508576145076144cd565b5b835b81811015614531578061451d8882613e60565b84526020840193505060208101905061450a565b5050509392505050565b600082601f8301126145505761454f614421565b5b81356145608482602086016144d2565b91505092915050565b600067ffffffffffffffff82111561458457614583614426565b5b602082029050602081019050919050565b60006145a86145a384614569565b614486565b905080838252602082019050602084028301858111156145cb576145ca6144cd565b5b835b818110156145f457806145e08882613fb4565b8452602084019350506020810190506145cd565b5050509392505050565b600082601f83011261461357614612614421565b5b8135614623848260208601614595565b91505092915050565b6000806000806080858703121561464657614645613e0d565b5b600061465487828801613e60565b945050602085013567ffffffffffffffff81111561467557614674613e12565b5b6146818782880161453b565b935050604085013567ffffffffffffffff8111156146a2576146a1613e12565b5b6146ae878288016145fe565b925050606085013567ffffffffffffffff8111156146cf576146ce613e12565b5b6146db878288016145fe565b91505092959194509250565b600080fd5b60008083601f84011261470257614701614421565b5b8235905067ffffffffffffffff81111561471f5761471e6146e7565b5b60208301915083602082028301111561473b5761473a6144cd565b5b9250929050565b60008083601f84011261475857614757614421565b5b8235905067ffffffffffffffff811115614775576147746146e7565b5b602083019150836020820283011115614791576147906144cd565b5b9250929050565b600080600080604085870312156147b2576147b1613e0d565b5b600085013567ffffffffffffffff8111156147d0576147cf613e12565b5b6147dc878288016146ec565b9450945050602085013567ffffffffffffffff8111156147ff576147fe613e12565b5b61480b87828801614742565b925092505092959194509250565b614822816140f2565b811461482d57600080fd5b50565b60008135905061483f81614819565b92915050565b61484e81614129565b811461485957600080fd5b50565b60008135905061486b81614845565b92915050565b60008060008060008060c0878903121561488e5761488d613e0d565b5b600061489c89828a01613e60565b96505060206148ad89828a01613fb4565b95505060406148be89828a01613fb4565b94505060606148cf89828a01614830565b93505060806148e089828a0161485c565b92505060a06148f189828a0161485c565b9150509295509295509295565b600080600080600080600060e0888a03121561491d5761491c613e0d565b5b600061492b8a828b01613e60565b975050602061493c8a828b01613e60565b965050604061494d8a828b01613fb4565b955050606061495e8a828b01613fb4565b945050608061496f8a828b01614830565b93505060a06149808a828b0161485c565b92505060c06149918a828b0161485c565b91505092959891949750929550565b600080604083850312156149b7576149b6613e0d565b5b60006149c585828601613e60565b92505060206149d685828601613e60565b9150509250929050565b6149e981614201565b81146149f457600080fd5b50565b600081359050614a06816149e0565b92915050565b60008060408385031215614a2357614a22613e0d565b5b6000614a3185828601613e60565b9250506020614a42858286016149f7565b9150509250929050565b614a5581614201565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b614a8c81614a5b565b82525050565b604082016000820151614aa86000850182614a4c565b506020820151614abb6020850182614a83565b50505050565b6000604082019050614ad66000830184614a92565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b2357607f821691505b60208210811415614b3757614b36614adc565b5b50919050565b7f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960008201527f6e74696e6720616c6c6f77616e63650000000000000000000000000000000000602082015250565b6000614b99602f83613ee3565b9150614ba482614b3d565b604082019050919050565b60006020820190508181036000830152614bc881614b8c565b9050919050565b7f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c60008201527f6c6f77656420746f206d696e7420796574000000000000000000000000000000602082015250565b6000614c2b603183613ee3565b9150614c3682614bcf565b604082019050919050565b60006020820190508181036000830152614c5a81614c1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c9b82613f93565b9150614ca683613f93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cdb57614cda614c61565b5b828201905092915050565b7f4552433230566f7465733a20667574757265206c6f6f6b757000000000000000600082015250565b6000614d1c601983613ee3565b9150614d2782614ce6565b602082019050919050565b60006020820190508181036000830152614d4b81614d0f565b9050919050565b7f4549503731323a20556e696e697469616c697a65640000000000000000000000600082015250565b6000614d88601583613ee3565b9150614d9382614d52565b602082019050919050565b60006020820190508181036000830152614db781614d7b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614e49602583613ee3565b9150614e5482614ded565b604082019050919050565b60006020820190508181036000830152614e7881614e3c565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000614edb602e83613ee3565b9150614ee682614e7f565b604082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960008201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b6000614f93604783613ee3565b9150614f9e82614f11565b606082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960008201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b600061504b604783613ee3565b915061505682614fc9565b606082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b600061508c82613f93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150bf576150be614c61565b5b600182019050919050565b6000819050919050565b60006150ef6150ea6150e5846150ca565b61415d565b6140f2565b9050919050565b6150ff816150d4565b82525050565b600060208201905061511a60008301846150f6565b92915050565b7f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160008201527f6d6f756e7473206d757374206265207468652073616d65206c656e6774680000602082015250565b600061517c603e83613ee3565b915061518782615120565b604082019050919050565b600060208201905081810360008301526151ab8161516f565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006151e8601d83613ee3565b91506151f3826151b2565b602082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b60006080820190506152336000830187614133565b61524060208301866141d7565b61524d6040830185614009565b61525a6060830184614009565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000615299601983613ee3565b91506152a482615263565b602082019050919050565b600060208201905081810360008301526152c88161528c565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000615305601d83613ee3565b9150615310826152cf565b602082019050919050565b60006020820190508181036000830152615334816152f8565b9050919050565b600060c0820190506153506000830189614133565b61535d60208301886141d7565b61536a60408301876141d7565b6153776060830186614009565b6153846080830185614009565b61539160a0830184614009565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006153d2601e83613ee3565b91506153dd8261539c565b602082019050919050565b60006020820190508181036000830152615401816153c5565b9050919050565b600060408201905061541d60008301856141d7565b61542a6020830184614009565b9392505050565b60008151905061544081614033565b92915050565b60006020828403121561545c5761545b613e0d565b5b600061546a84828501615431565b91505092915050565b7f456967656e2e756e777261703a2062454947454e207472616e7366657220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b60006154cf602483613ee3565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b600060608201905061551a60008301866141d7565b61552760208301856141d7565b6155346040830184614009565b949350505050565b7f456967656e2e777261703a2062454947454e207472616e73666572206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000615598602283613ee3565b91506155a38261553c565b604082019050919050565b600060208201905081810360008301526155c78161558b565b9050919050565b7f456967656e2e64697361626c655472616e736665725265737472696374696f6e60008201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260208201527f656164792064697361626c656400000000000000000000000000000000000000604082015250565b6000615650604d83613ee3565b915061565b826155ce565b606082019050919050565b6000602082019050818103600083015261567f81615643565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156e2602683613ee3565b91506156ed82615686565b604082019050919050565b60006020820190508181036000830152615711816156d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615774602483613ee3565b915061577f82615718565b604082019050919050565b600060208201905081810360008301526157a381615767565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615806602283613ee3565b9150615811826157aa565b604082019050919050565b60006020820190508181036000830152615835816157f9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000615898603083613ee3565b91506158a38261583c565b604082019050919050565b600060208201905081810360008301526158c78161588b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615904602083613ee3565b915061590f826158ce565b602082019050919050565b60006020820190508181036000830152615933816158f7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000615970601d83613ee3565b915061597b8261593a565b602082019050919050565b6000602082019050818103600083015261599f81615963565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615a02602583613ee3565b9150615a0d826159a6565b604082019050919050565b60006020820190508181036000830152615a31816159f5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615a94602383613ee3565b9150615a9f82615a38565b604082019050919050565b60006020820190508181036000830152615ac381615a87565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615b26602683613ee3565b9150615b3182615aca565b604082019050919050565b60006020820190508181036000830152615b5581615b19565b9050919050565b6000615b6782613f93565b9150615b7283613f93565b925082821015615b8557615b84614c61565b5b828203905092915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615bec602683613ee3565b9150615bf782615b90565b604082019050919050565b60006020820190508181036000830152615c1b81615bdf565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203460008201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b6000615c7e602683613ee3565b9150615c8982615c22565b604082019050919050565b60006020820190508181036000830152615cad81615c71565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000615d10602b83613ee3565b9150615d1b82615cb4565b604082019050919050565b60006020820190508181036000830152615d3f81615d03565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615d7c601f83613ee3565b9150615d8782615d46565b602082019050919050565b60006020820190508181036000830152615dab81615d6f565b9050919050565b7f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60008201527f206f7220746f206d7573742062652077686974656c6973746564000000000000602082015250565b6000615e0e603a83613ee3565b9150615e1982615db2565b604082019050919050565b60006020820190508181036000830152615e3d81615e01565b9050919050565b600060a082019050615e596000830188614133565b615e666020830187614133565b615e736040830186614133565b615e806060830185614009565b615e8d60808301846141d7565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ed182613f93565b9150615edc83613f93565b925082615eec57615eeb615e97565b5b828204905092915050565b6000604082019050615f0c6000830185614009565b615f196020830184614009565b9392505050565b6000608082019050615f356000830187614133565b615f4260208301866140ff565b615f4f6040830185614133565b615f5c6060830184614133565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615fca601883613ee3565b9150615fd582615f94565b602082019050919050565b60006020820190508181036000830152615ff981615fbd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616036601f83613ee3565b915061604182616000565b602082019050919050565b6000602082019050818103600083015261606581616029565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006160c8602283613ee3565b91506160d38261606c565b604082019050919050565b600060208201905081810360008301526160f7816160bb565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061615a602783613ee3565b9150616165826160fe565b604082019050919050565b600060208201905081810360008301526161898161614d565b905091905056fea264697066735822122033db7c2b5be688e3303e3b776cba47b11848c7bcbcb35c9e20d29fbd2cea926264736f6c634300080c0033", } // 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 4eac2f7d4..601cbe363 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -29,26 +29,31 @@ var ( _ = abi.ConvertType ) +// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceProof struct { + PubkeyHash [32]byte + BalanceRoot [32]byte + Proof []byte +} + // BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct. type BeaconChainProofsStateRootProof struct { BeaconStateRoot [32]byte Proof []byte } -// BeaconChainProofsWithdrawalProof is an auto generated low-level Go binding around an user-defined struct. -type BeaconChainProofsWithdrawalProof struct { - WithdrawalProof []byte - SlotProof []byte - ExecutionPayloadProof []byte - TimestampProof []byte - HistoricalSummaryBlockRootProof []byte - BlockRootIndex uint64 - HistoricalSummaryIndex uint64 - WithdrawalIndex uint64 - BlockRoot [32]byte - SlotRoot [32]byte - TimestampRoot [32]byte - ExecutionPayloadRoot [32]byte +// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsValidatorProof struct { + ValidatorFields [][32]byte + Proof []byte +} + +// IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodCheckpoint struct { + BeaconBlockRoot [32]byte + PodBalanceGwei *big.Int + BalanceDeltasGwei *big.Int + ProofsRemaining *big.Int } // IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. @@ -61,8 +66,8 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonBeaconChainETHBalanceWei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provenWithdrawal\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"sumOfPartialWithdrawalsClaimedGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyAndProcessWithdrawals\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"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\":\"withdrawalProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.WithdrawalProof[]\",\"components\":[{\"name\":\"withdrawalProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"slotProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executionPayloadProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timestampProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"historicalSummaryBlockRootProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blockRootIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"historicalSummaryIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"withdrawalIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestampRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executionPayloadRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"},{\"name\":\"withdrawalFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyBalanceUpdates\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"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\":\"withdrawBeforeRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawNonBeaconChainETHBalanceWei\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountToWithdraw\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FullWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"withdrawalAmountGwei\",\"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\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PartialWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"partialWithdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162005fc038038062005fc083398101604081905262000035916200016f565b6001600160a01b0380861660805284811660a052831660c0526001600160401b0380831660e0528116610100526200006c62000077565b5050505050620001e7565b600054610100900460ff1615620000e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000137576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014f57600080fd5b50565b80516001600160401b03811681146200016a57600080fd5b919050565b600080600080600060a086880312156200018857600080fd5b8551620001958162000139565b6020870151909550620001a88162000139565b6040870151909450620001bb8162000139565b9250620001cb6060870162000152565b9150620001db6080870162000152565b90509295509295909350565b60805160a05160c05160e05161010051615cde620002e2600039600081816105b501528181612030015281816120e7015261213f015260008181610275015281816125d00152818161260401528181612c3001528181612c5d015281816143a401526143df01526000818161036d01528181610614015281816107a701528181610aef01528181610c4401528181610dcc01528181610f87015281816111680152818161129c0152818161146d015281816118ba01528181611a6201528181611ba101528181611d6e01528181611e58015261315401526000818161024101526133c60152600081816104520152610e970152615cde6000f3fe6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614c9f565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614cdc565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614d6f565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039b57600080fd5b506103af6103aa366004614e80565b610caf565b60405161020f9190614ef9565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614f07565b610d14565b60405161020f9190614f20565b34801561041557600080fd5b506103af610424366004614f07565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614f68565b610dc1565b3480156104ba57600080fd5b5061022d6104c9366004614fdb565b610f6e565b3480156104da57600080fd5b506103fc6104e9366004614e80565b611304565b3480156104fa57600080fd5b5061022d6113f7565b34801561050f57600080fd5b5061022d61051e366004615085565b611462565b34801561052f57600080fd5b5061022d61053e3660046150b1565b61169f565b34801561054f57600080fd5b5061022d61055e3660046151cb565b611877565b34801561056f57600080fd5b5061022d61057e36600461529c565b611a4a565b34801561058f57600080fd5b5061022d61059e366004615085565b611e15565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190615397565b156106ad5760405162461bcd60e51b81526004016106a4906153b9565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a49061545e565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611ff8565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190615397565b156108375760405162461bcd60e51b81526004016106a4906153b9565b603454600160401b900460ff166108af5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b85841480156108bd57508382145b61094d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b603354600160a01b90046001600160401b031615806109a2575060335461098c9061098790600160a01b90046001600160401b031661202c565b612116565b6001600160401b0316896001600160401b031610155b610a2e5760405162461bcd60e51b815260206004820152605160248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2070726f6f66206d75737420626520696e207468652065706f63686064820152701030b33a32b91030b1ba34bb30ba34b7b760791b608482015260a4016106a4565b42610a44613f486001600160401b038c16614c9f565b1015610acd5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152610b76907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906154ad565b8935610b7160208c018c6154c6565b612163565b6000805b87811015610c1a57610bfc8b8b358b8b85818110610b9a57610b9a61550c565b9050602002016020810190610baf9190615522565b8a8a86818110610bc157610bc161550c565b9050602002810190610bd391906154c6565b8a8a88818110610be557610be561550c565b9050602002810190610bf79190615549565b6122f1565b610c069083614c9f565b915080610c1281615592565b915050610b7a565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c40906044015b600060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b5050505050505050505050505050565b600080610cf184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610d3c6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610da757610da7614ec1565b6002811115610db857610db8614ec1565b90525092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e095760405162461bcd60e51b81526004016106a4906155ad565b346801bc16d674ec80000014610e955760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610ed86128a5565b8888886040518863ffffffff1660e01b8152600401610efc9695949392919061567f565b6000604051808303818588803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610f5f9291906156ce565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615397565b156110175760405162461bcd60e51b81526004016106a4906153b9565b868414801561102557508382145b6110ae5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b426110c4613f486001600160401b038c16614c9f565b10156111465760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a1660048201526111ea907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db91906154ad565b8735610b7160208a018a6154c6565b6000805b8881101561128e576112708b8b8b8481811061120c5761120c61550c565b90506020020160208101906112219190615522565b8a358a8a868181106112355761123561550c565b905060200281019061124791906154c6565b8a8a888181106112595761125961550c565b905060200281019061126b9190615549565b6128ea565b61127a90836156e2565b91508061128681615592565b9150506111ee565b506033546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163c2c51c4091166112d3633b9aca0085615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610c71565b61132c6040805160808101825260008082526020820181905291810182905290606082015290565b6036600061136f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113dc576113dc614ec1565b60028111156113ed576113ed614ec1565b9052509392505050565b6033546001600160a01b031633146114215760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff161561144b5760405162461bcd60e51b81526004016106a49061545e565b603354611460906001600160a01b0316611ff8565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114aa5760405162461bcd60e51b81526004016106a4906155ad565b6114b8633b9aca00826157be565b156115425760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b6000611552633b9aca00836157d2565b6034549091506001600160401b03908116908216111561160b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906116299084906001600160401b03166157e6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161168891815260200190565b60405180910390a261169a8383612dc8565b505050565b600054610100900460ff16158080156116bf5750600054600160ff909116105b806116d95750303b1580156116d9575060005460ff166001145b61173c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff19166001179055801561175f576000805461ff0019166101001790555b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611873576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118a15760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190615397565b1561194a5760405162461bcd60e51b81526004016106a4906153b9565b82518451146119d55760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b8451811015611a4357611a31838583815181106119f7576119f761550c565b6020026020010151878481518110611a1157611a1161550c565b60200260200101516001600160a01b0316612dd29092919063ffffffff16565b80611a3b81615592565b9150506119d8565b5050505050565b604051635ac86ab760e01b81526004808201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190615397565b15611af25760405162461bcd60e51b81526004016106a4906153b9565b8386148015611b0057508588145b8015611b0b57508782145b611b7f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611c23907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906154ad565b8b35610b7160208e018e6154c6565b604080518082019091526000808252602082015260005b83811015611d23576000611cde8d358d8d85818110611c5b57611c5b61550c565b9050602002810190611c6d919061580e565b8c8c86818110611c7f57611c7f61550c565b9050602002810190611c9191906154c6565b8c8c88818110611ca357611ca361550c565b9050602002810190611cb59190615549565b8c8c8a818110611cc757611cc761550c565b9050602002810190611cd99190615549565b612e24565b80518451919250908490611cf3908390614c9f565b9052506020808201519084018051611d0c9083906156e2565b905250819050611d1b81615592565b915050611c3a565b50805115611d52576033548151611d52916001600160a01b031690611d4d90633b9aca009061582f565b61339c565b602081015115611e075760335460208201516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263c2c51c4092911690611da890633b9aca0090615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190615397565b15611ee85760405162461bcd60e51b81526004016106a4906153b9565b603754821115611f995760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611fab919061584e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261169a838361339c565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755612029814761339c565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316826001600160401b031610156120d65760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6120e2600c6020615865565b61210c7f0000000000000000000000000000000000000000000000000000000000000000846157e6565b610d0e9190615894565b6000612124600c6020615865565b61212f8360016158ba565b6121399190615865565b610d0e907f00000000000000000000000000000000000000000000000000000000000000006158ba565b61216f6003602061582f565b81146121ff5760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61224482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061342a565b6122eb5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061233084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561239f5761239f614ec1565b60028111156123b0576123b0614ec1565b90525090506000816060015160028111156123cd576123cd614ec1565b146124765760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b61247e6128a5565b612487906158e5565b6124c386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061346692505050565b1461254a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b600061258886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b90506125988a87878b8b8e6134a0565b603980549060006125a883615592565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f00000000000000000000000000000000000000000000000000000000000000008116908216111561262e576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016602083015261263e565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156126dc576126dc614ec1565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516127779392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b031661279c919061582f565b9b9a5050505050505050505050565b600081516030146128345760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061284b908490600090602001615909565b60408051601f198184030181529082905261286591615938565b602060405180830381855afa158015612882573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d0e91906154ad565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061292984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b9050600061296985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156129d8576129d8614ec1565b60028111156129e9576129e9614ec1565b8152505090508a6001600160401b031681604001516001600160401b031610612aa05760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b600181606001516002811115612ab857612ab8614ec1565b14612b205760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b612b298b61202c565b6001600160401b0316612b6e8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b031611612c11576000836001600160401b031611612c115760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612c1f8987878b8b8f6134a0565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000000000000081169086161115612c8157507f0000000000000000000000000000000000000000000000000000000000000000612c84565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612d2c57612d2c614ec1565b0217905550905050816001600160401b0316816001600160401b031614612db8577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612da39392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612db5818361370f565b95505b5050505050979650505050505050565b611873828261372e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261169a908490613847565b6040805180820190915260008082526020820152612e49612e44896159b9565b613919565b6033546001600160401b03600160a01b90910481169082161015612f0b5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60448201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460648201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960848201526606d657374616d760cc1b60a482015260c4016106a4565b6000612f19612e448b6159b9565b90506000612f5988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612f8657612f86614ec1565b141561303d5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156130fc5760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506131d98c87878e7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d49190615af5565b613929565b600061321787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061434a92505050565b90506132278d8a8a8e8e866134a0565b600061326588888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436292505050565b90506132a38a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b03166132bd6132b88f6159b9565b61437a565b6001600160401b03161061337557603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261336a93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561335157613351614ec1565b600281111561336257613362614ec1565b90525061438c565b95505050505061338f565b60335461336a90839086906001600160a01b0316846145ca565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063c0db354c9083906044016000604051808303818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050505050565b6000836134388685856146a8565b1495945050505050565b6000816000815181106134575761345761550c565b60200260200101519050919050565b6000816001815181106134575761345761550c565b6000610d0e826002815181106134935761349361550c565b60200260200101516147f4565b6134ac60036002615bf6565b84146135375760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561354560286001614c9f565b61354f9190614c9f565b61355a90602061582f565b82146135da5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166135f060286001614c9f565b600b901b179050600061363587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b905061367b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061342a565b6136ed5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b6000610d0e826007815181106134935761349361550c565b60006137276001600160401b03808416908516615c02565b9392505050565b8047101561377e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b505090508061169a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b600061389c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b089092919063ffffffff16565b80519091501561169a57808060200190518101906138ba9190615397565b61169a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610d0e8261014001516147f4565b613934600280615bf6565b83146139a85760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6139b4600d6002615bf6565b6139c460c0840160a08501615c41565b6001600160401b031610613a2e5760405162461bcd60e51b815260206004820152603f6024820152600080516020615c8983398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b613a3a60046002615bf6565b613a4b610100840160e08501615c41565b6001600160401b031610613ab7576040805162461bcd60e51b8152602060048201526024810191909152600080516020615c8983398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b613ac360186002615bf6565b613ad360e0840160c08501615c41565b6001600160401b031610613b4d5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613b65612e44856159b9565b6001600160401b031610613b7a576005613b7d565b60045b9050613b8a600482614c9f565b613b95906001614c9f565b613ba090602061582f565b613baa84806154c6565b905014613c1e5760405162461bcd60e51b81526020600482015260486024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613c2a60046003614c9f565b613c3590602061582f565b613c4260408501856154c6565b905014613cbc5760405162461bcd60e51b815260206004820152604e6024820152600080516020615c8983398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613cc86003602061582f565b613cd560208501856154c6565b905014613d435760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613d4e81602061582f565b613d5b60608501856154c6565b905014613dce5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ddc60186001614c9f565b613de7906005614c9f565b613df2906001614c9f565b613dfc9190614c9f565b613e0790602061582f565b613e1460808501856154c6565b905014613e9d5760405162461bcd60e51b81526020600482015260586024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613eaf60c0850160a08601615c41565b6001600160401b03166000613ec6600d6001614c9f565b613ed660e0880160c08901615c41565b6001600160401b0316901b600d613eef60186001614c9f565b613efa906001614c9f565b613f049190614c9f565b601b901b1717179050613f5f613f1d60808601866154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925050506101008701358461342a565b613fd25760405162461bcd60e51b815260206004820152604a6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b614029613fe260208601866154c6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a01359250905061342a565b6140895760405162461bcd60e51b815260206004820152603d6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b60496140e161409b60408701876154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008701356101608801358461342a565b6141535760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b506141ab61416460608601866154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135610140870135600961342a565b6142165760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b6000614229610100860160e08701615c41565b6001600160401b031661423e60046001614c9f565b600e901b179050600061428388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b90506142d361429287806154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160880135838561342a565b61433f5760405162461bcd60e51b81526020600482015260436024820152600080516020615c8983398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610d0e826001815181106134935761349361550c565b6000610d0e826003815181106134935761349361550c565b6000602061210c8361012001516147f4565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316846001600160401b0316111561440357507f0000000000000000000000000000000000000000000000000000000000000000614406565b50825b604080518082019091526000808252602082015261442482866157e6565b6001600160401b039081168252603480548492600091614446918591166158ba565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061447882856020015161370f565b602082015260028460600151600281111561449557614495614ec1565b146144b757603980549060006144aa83615c5e565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561455c5761455c614ec1565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a26038805483919060009061465b9084906001600160401b03166158ba565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156146c75750602084516146c591906157be565b155b6147565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116147ea5761477a6002856157be565b6147ad578151600052808601516020526020826040600060026107d05a03fa6147a257600080fd5b6002840493506147d8565b8086015160005281516020526020826040600060026107d05a03fa6147d157600080fd5b6002840493505b6147e3602082614c9f565b9050614767565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161486c91906157d2565b90506000816001600160401b03811115614888576148886150ce565b6040519080825280602002602001820160405280156148b1578160200160208202803683370190505b50905060005b828110156149b8576002856148cc838361582f565b815181106148dc576148dc61550c565b6020026020010151868360026148f2919061582f565b6148fd906001614c9f565b8151811061490d5761490d61550c565b602002602001015160405160200161492f929190918252602082015260400190565b60408051601f198184030181529082905261494991615938565b602060405180830381855afa158015614966573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061498991906154ad565b82828151811061499b5761499b61550c565b6020908102919091010152806149b081615592565b9150506148b7565b506149c46002836157d2565b91505b8115614ae45760005b82811015614ad1576002826149e5838361582f565b815181106149f5576149f561550c565b602002602001015183836002614a0b919061582f565b614a16906001614c9f565b81518110614a2657614a2661550c565b6020026020010151604051602001614a48929190918252602082015260400190565b60408051601f1981840301815290829052614a6291615938565b602060405180830381855afa158015614a7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614aa291906154ad565b828281518110614ab457614ab461550c565b602090810291909101015280614ac981615592565b9150506149d0565b50614add6002836157d2565b91506149c7565b80600081518110614af757614af761550c565b602002602001015192505050919050565b6060614b178484600085614b1f565b949350505050565b606082471015614b805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614bf39190615938565b60006040518083038185875af1925050503d8060008114614c30576040519150601f19603f3d011682016040523d82523d6000602084013e614c35565b606091505b5091509150614c45828286614c50565b979650505050505050565b60608315614c5f575081613727565b825115614c6f5782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615c75565b634e487b7160e01b600052601160045260246000fd5b60008219821115614cb257614cb2614c89565b500190565b6001600160401b038116811461202957600080fd5b8035614cd781614cb7565b919050565b60008060408385031215614cef57600080fd5b823591506020830135614d0181614cb7565b809150509250929050565b600060408284031215614d1e57600080fd5b50919050565b60008083601f840112614d3657600080fd5b5081356001600160401b03811115614d4d57600080fd5b6020830191508360208260051b8501011115614d6857600080fd5b9250929050565b60008060008060008060008060a0898b031215614d8b57600080fd5b8835614d9681614cb7565b975060208901356001600160401b0380821115614db257600080fd5b614dbe8c838d01614d0c565b985060408b0135915080821115614dd457600080fd5b614de08c838d01614d24565b909850965060608b0135915080821115614df957600080fd5b614e058c838d01614d24565b909650945060808b0135915080821115614e1e57600080fd5b50614e2b8b828c01614d24565b999c989b5096995094979396929594505050565b60008083601f840112614e5157600080fd5b5081356001600160401b03811115614e6857600080fd5b602083019150836020828501011115614d6857600080fd5b60008060208385031215614e9357600080fd5b82356001600160401b03811115614ea957600080fd5b614eb585828601614e3f565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614ef557634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d0e8284614ed7565b600060208284031215614f1957600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614f616060840182614ed7565b5092915050565b600080600080600060608688031215614f8057600080fd5b85356001600160401b0380821115614f9757600080fd5b614fa389838a01614e3f565b90975095506020880135915080821115614fbc57600080fd5b50614fc988828901614e3f565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614ff757600080fd5b883561500281614cb7565b975060208901356001600160401b038082111561501e57600080fd5b61502a8c838d01614d24565b909950975060408b013591508082111561504357600080fd5b61504f8c838d01614d0c565b965060608b0135915080821115614df957600080fd5b6001600160a01b038116811461202957600080fd5b8035614cd781615065565b6000806040838503121561509857600080fd5b82356150a381615065565b946020939093013593505050565b6000602082840312156150c357600080fd5b813561372781615065565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715615107576151076150ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615135576151356150ce565b604052919050565b60006001600160401b03821115615156576151566150ce565b5060051b60200190565b600082601f83011261517157600080fd5b813560206151866151818361513d565b61510d565b82815260059290921b840181019181810190868411156151a557600080fd5b8286015b848110156151c057803583529183019183016151a9565b509695505050505050565b6000806000606084860312156151e057600080fd5b83356001600160401b03808211156151f757600080fd5b818601915086601f83011261520b57600080fd5b8135602061521b6151818361513d565b82815260059290921b8401810191818101908a84111561523a57600080fd5b948201945b8386101561526157853561525281615065565b8252948201949082019061523f565b9750508701359250508082111561527757600080fd5b5061528486828701615160565b9250506152936040850161507a565b90509250925092565b60008060008060008060008060008060c08b8d0312156152bb57600080fd5b6152c48b614ccc565b995060208b01356001600160401b03808211156152e057600080fd5b6152ec8e838f01614d0c565b9a5060408d013591508082111561530257600080fd5b61530e8e838f01614d24565b909a50985060608d013591508082111561532757600080fd5b6153338e838f01614d24565b909850965060808d013591508082111561534c57600080fd5b6153588e838f01614d24565b909650945060a08d013591508082111561537157600080fd5b5061537e8d828e01614d24565b915080935050809150509295989b9194979a5092959850565b6000602082840312156153a957600080fd5b8151801515811461372757600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6000602082840312156154bf57600080fd5b5051919050565b6000808335601e198436030181126154dd57600080fd5b8301803591506001600160401b038211156154f757600080fd5b602001915036819003821315614d6857600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561553457600080fd5b813564ffffffffff8116811461372757600080fd5b6000808335601e1984360301811261556057600080fd5b8301803591506001600160401b0382111561557a57600080fd5b6020019150600581901b3603821315614d6857600080fd5b60006000198214156155a6576155a6614c89565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561564257818101518382015260200161562a565b838111156122eb5750506000910152565b6000815180845261566b816020860160208601615627565b601f01601f19169290920160200192915050565b60808152600061569360808301888a6155fe565b82810360208401526156a58188615653565b905082810360408401526156ba8186886155fe565b915050826060830152979650505050505050565b602081526000614b176020830184866155fe565b600080821280156001600160ff1b038490038513161561570457615704614c89565b600160ff1b839003841281161561571d5761571d614c89565b50500190565b60006001600160ff1b038184138284138082168684048611161561574957615749614c89565b600160ff1b600087128281168783058912161561576857615768614c89565b6000871292508782058712848416161561578457615784614c89565b8785058712818416161561579a5761579a614c89565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826157cd576157cd6157a8565b500690565b6000826157e1576157e16157a8565b500490565b60006001600160401b038381169083168181101561580657615806614c89565b039392505050565b6000823561017e1983360301811261582557600080fd5b9190910192915050565b600081600019048311821515161561584957615849614c89565b500290565b60008282101561586057615860614c89565b500390565b60006001600160401b038083168185168183048111821515161561588b5761588b614c89565b02949350505050565b60006001600160401b03808416806158ae576158ae6157a8565b92169190910492915050565b60006001600160401b038083168185168083038211156158dc576158dc614c89565b01949350505050565b80516020808301519190811015614d1e5760001960209190910360031b1b16919050565b6000835161591b818460208801615627565b6001600160801b0319939093169190920190815260100192915050565b60008251615825818460208701615627565b600082601f83011261595b57600080fd5b81356001600160401b03811115615974576159746150ce565b615987601f8201601f191660200161510d565b81815284602083860101111561599c57600080fd5b816020850160208301376000918101602001919091529392505050565b600061018082360312156159cc57600080fd5b6159d46150e4565b82356001600160401b03808211156159eb57600080fd5b6159f73683870161594a565b83526020850135915080821115615a0d57600080fd5b615a193683870161594a565b60208401526040850135915080821115615a3257600080fd5b615a3e3683870161594a565b60408401526060850135915080821115615a5757600080fd5b615a633683870161594a565b60608401526080850135915080821115615a7c57600080fd5b50615a893682860161594a565b608083015250615a9b60a08401614ccc565b60a0820152615aac60c08401614ccc565b60c0820152615abd60e08401614ccc565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600060208284031215615b0757600080fd5b815161372781614cb7565b600181815b80851115615b4d578160001904821115615b3357615b33614c89565b80851615615b4057918102915b93841c9390800290615b17565b509250929050565b600082615b6457506001610d0e565b81615b7157506000610d0e565b8160018114615b875760028114615b9157615bad565b6001915050610d0e565b60ff841115615ba257615ba2614c89565b50506001821b610d0e565b5060208310610133831016604e8410600b8410161715615bd0575081810a610d0e565b615bda8383615b12565b8060001904821115615bee57615bee614c89565b029392505050565b60006137278383615b55565b60008083128015600160ff1b850184121615615c2057615c20614c89565b6001600160ff1b0384018313811615615c3b57615c3b614c89565b50500390565b600060208284031215615c5357600080fd5b813561372781614cb7565b600081615c6d57615c6d614c89565b506000190190565b602081526000613727602083018461565356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a26469706673582212209823bc309d91b4d7a350627f253d554a4bfb7cc28ec8e22db1573b1e1ff3290764736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"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\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"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\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + Bin: "0x6101006040523480156200001257600080fd5b50604051620048d8380380620048d883398101604081905262000035916200014a565b6001600160a01b0380851660805283811660a052821660c0526001600160401b03811660e052620000656200006f565b50505050620001bd565b600054610100900460ff1615620000dc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156200012f576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014757600080fd5b50565b600080600080608085870312156200016157600080fd5b84516200016e8162000131565b6020860151909450620001818162000131565b6040860151909350620001948162000131565b60608601519092506001600160401b0381168114620001b257600080fd5b939692955090935050565b60805160a05160c05160e051614694620002446000396000610592015260008181610337015281816105cd0152818161098301528181610b4a01528181610e680152818161108301528181611179015281816114190152818161186101528181611a0a0152612dfc0152600061022f015260008181610444015261124401526146946000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063b522538a1161008a578063dda3346c11610064578063dda3346c14610520578063ee94d67c14610540578063f074ba6214610560578063f28824611461058057600080fd5b8063b522538a146104c0578063c4907442146104e0578063c4d66de81461050057600080fd5b80636fcd0e53146103ce5780637439841f146103fb57806374cdd7981461043257806387e0d2891461046657806388676cad1461048d5780639b4e4634146104ad57600080fd5b80633474aa16116101235780633474aa16146102a65780633f65cf19146102de57806342ecff2a146102fe5780634665bcda1461032557806347d283721461035957806358eaee79146103a157600080fd5b8063039157d2146101a95780630b18ff66146101cb5780630cd4649e146102085780631a5057be1461021d5780632340e8d3146102515780633106ab531461027557600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c43660046138fc565b6105b4565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b506101c961096a565b34801561022957600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025d57600080fd5b5061026760395481565b6040519081526020016101ff565b34801561028157600080fd5b5060345461029690600160401b900460ff1681565b60405190151581526020016101ff565b3480156102b257600080fd5b506034546102c6906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b3480156102ea57600080fd5b506101c96102f93660046139ba565b610b07565b34801561030a57600080fd5b50603a546102c690600160401b90046001600160401b031681565b34801561033157600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036557600080fd5b5061036e610ed3565b6040516101ff91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b3480156103ad57600080fd5b506103c16103bc366004613ac9565b610f2e565b6040516101ff9190613b42565b3480156103da57600080fd5b506103ee6103e9366004613b50565b610f93565b6040516101ff9190613b69565b34801561040757600080fd5b506103c1610416366004613b50565b600090815260366020526040902054600160c01b900460ff1690565b34801561043e57600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506033546102c690600160a01b90046001600160401b031681565b34801561049957600080fd5b506101c96104a8366004613bbf565b611040565b6101c96104bb366004613bdc565b61116e565b3480156104cc57600080fd5b506103ee6104db366004613ac9565b61131b565b3480156104ec57600080fd5b506101c96104fb366004613c6f565b61140e565b34801561050c57600080fd5b506101c961051b366004613c9b565b611646565b34801561052c57600080fd5b506101c961053b366004613d8c565b61181e565b34801561054c57600080fd5b50603a546102c6906001600160401b031681565b34801561056c57600080fd5b506101c961057b366004613e5d565b6119f1565b34801561058c57600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190613ec5565b156106665760405162461bcd60e51b815260040161065d90613ee2565b60405180910390fd5b60006106ac6106758480613f3f565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0692505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561071b5761071b613b0a565b600281111561072c5761072c613b0a565b8152505090506212750081604001516001600160401b031661074e9190613f9e565b866001600160401b0316116107cb5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c652079657400606482015260840161065d565b6001816060015160028111156107e3576107e3613b0a565b1461084d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b606482015260840161065d565b61089161085a8580613f3f565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2a92505050565b6109155760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a40161065d565b61093561092187611d54565b86356109306020890189613fb6565b611f0a565b61095885356109448680613f3f565b6109516020890189613fb6565b8651612098565b61096260006122b9565b505050505050565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613ec5565b15610a135760405162461bcd60e51b815260040161065d90613ee2565b6033546001600160a01b03163314610a3d5760405162461bcd60e51b815260040161065d90613ffc565b603454600160401b900460ff1615610aaf5760405162461bcd60e51b815260206004820152602f60248201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160448201526e1ada5b99c81a5cc8195b98589b1959608a1b606482015260840161065d565b6034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2610b0460006122b9565b50565b6033546001600160a01b03163314610b315760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd9190613ec5565b15610bda5760405162461bcd60e51b815260040161065d90613ee2565b6034548990600160401b900460ff168015610c0b57506033546001600160401b03600160a01b909104811690821610155b610c275760405162461bcd60e51b815260040161065d90614044565b8685148015610c3557508483145b610cc55760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161065d565b603a546001600160401b03908116908b16118015610cf85750603a546001600160401b03600160401b9091048116908b16115b610d7f5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161065d565b610d9a610d8b8b611d54565b8a3561093060208d018d613fb6565b6000805b88811015610e3e57610e208c8c358c8c85818110610dbe57610dbe6140b8565b9050602002016020810190610dd391906140ce565b8b8b86818110610de557610de56140b8565b9050602002810190610df79190613fb6565b8b8b88818110610e0957610e096140b8565b9050602002810190610e1b9190613f3f565b6124a0565b610e2a9083613f9e565b915080610e36816140f5565b915050610d9e565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610eae57600080fd5b505af1158015610ec2573d6000803e3d6000fd5b505050505050505050505050505050565b610f016040518060800160405280600080191681526020016000815260200160008152602001600081525090565b5060408051608081018252603b548152603c546020820152603d5491810191909152603e54606082015290565b600080610f7084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299992505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610fbb6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561102657611026613b0a565b600281111561103757611037613b0a565b90525092915050565b6033546001600160a01b0316331461106a5760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190613ec5565b156111135760405162461bcd60e51b815260040161065d90613ee2565b6034544290600160401b900460ff16801561114457506033546001600160401b03600160a01b909104811690821610155b6111605760405162461bcd60e51b815260040161065d90614044565b611169836122b9565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b65760405162461bcd60e51b815260040161065d90614110565b346801bc16d674ec800000146112425760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161065d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611285612a93565b8888886040518863ffffffff1660e01b81526004016112a9969594939291906141e2565b6000604051808303818588803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161130c929190614231565b60405180910390a15050505050565b6113436040805160808101825260008082526020820181905291810182905290606082015290565b6036600061138685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299992505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113f3576113f3613b0a565b600281111561140457611404613b0a565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114565760405162461bcd60e51b815260040161065d90614110565b611464633b9aca008261425b565b156114ee5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161065d565b60006114fe633b9aca008361426f565b6034549091506001600160401b0390811690821611156115b75760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c40161065d565b603480548291906000906115d59084906001600160401b0316614283565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161163491815260200190565b60405180910390a26111698383612ad8565b600054610100900460ff16158080156116665750600054600160ff909116105b806116805750303b158015611680575060005460ff166001145b6116e35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065d565b6000805460ff191660011790558015611706576000805461ff0019166101001790555b6001600160a01b0382166117795760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161065d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118485760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190613ec5565b156118f15760405162461bcd60e51b815260040161065d90613ee2565b825184511461197c5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161065d565b60005b84518110156119ea576119d88385838151811061199e5761199e6140b8565b60200260200101518784815181106119b8576119b86140b8565b60200260200101516001600160a01b0316612ae29092919063ffffffff16565b806119e2816140f5565b91505061197f565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190613ec5565b15611a9a5760405162461bcd60e51b815260040161065d90613ee2565b603a54600160401b90046001600160401b031680611b465760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a40161065d565b60408051608081018252603b54808252603c54602080840191909152603d5493830193909352603e5460608301529091611b8a9190883590610930908a018a613fb6565b60005b84811015611cfc57600060366000888885818110611bad57611bad6140b8565b9050602002810190611bbf91906142ab565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611c2d57611c2d613b0a565b6002811115611c3e57611c3e613b0a565b9052509050600181606001516002811115611c5b57611c5b613b0a565b14611c665750611cea565b836001600160401b031681604001516001600160401b03161015611c8a5750611cea565b6000611cbc82868b358b8b88818110611ca557611ca56140b8565b9050602002810190611cb791906142ab565b612b34565b606085018051919250611cce826142cb565b815250508084604001818151611ce491906142e2565b90525050505b80611cf4816140f5565b915050611b8d565b5061096281612d2b565b600081600081518110611d1b57611d1b6140b8565b60200260200101519050919050565b600081600381518110611d3f57611d3f6140b8565b60200260200101516000801b14159050919050565b6000611d63611fff600c614323565b611d766001600160401b03841642614342565b10611de05760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b606482015260840161065d565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e2891614359565b600060405180830381855afa9150503d8060008114611e63576040519150601f19603f3d011682016040523d82523d6000602084013e611e68565b606091505b5091509150818015611e7b575060008151115b15611e9c5780806020019051810190611e94919061436b565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e656400000000000000606482015260840161065d565b611f1660036020614323565b8114611fa65760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161065d565b611feb82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612ebe565b6120925760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161065d565b50505050565b6120a460036002614468565b841461211d5760405162461bcd60e51b815260206004820152604e602482015260008051602061463f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161065d565b600561212b60286001613f9e565b6121359190613f9e565b612140906020614323565b82146121ae5760405162461bcd60e51b8152602060048201526043602482015260008051602061463f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161065d565b600064ffffffffff82166121c460286001613f9e565b600b901b1790506000612209878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ed692505050565b905061224f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612ebe565b6122af5760405162461bcd60e51b815260206004820152603d602482015260008051602061463f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161065d565b5050505050505050565b603a54600160401b90046001600160401b03161561235a5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a40161065d565b6034546000906001600160401b0316612377633b9aca004761426f565b6123819190614342565b905081801561238e575080155b156124015760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e74000000606482015260840161065d565b6000604051806080016040528061241742611d54565b81526020810184905260006040820152603954606090910152603a80546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055905061246581612d2b565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124df848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0692505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561254e5761254e613b0a565b600281111561255f5761255f613b0a565b905250905060008160600151600281111561257c5761257c613b0a565b1461261f5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c40161065d565b6001600160401b03801661266586868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318392505050565b6001600160401b0316146126ef5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a40161065d565b6126f7612a93565b61270090614474565b61273c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131a892505050565b146127bd5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a40161065d565b60006127fb8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131bd92505050565b905061280b8a87878b8b8e612098565b6039805490600061281b836140f5565b9091555060019050606083018190525064ffffffffff891682526001600160401b038b811660408085019182528383166020808701918252600088815260369091529190912085518154925193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b0319909416919095161791909117918216831781556060850151859391929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156128e2576128e2613b0a565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8b1681526001600160401b038d8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a161298a633b9aca006001600160401b038316614323565b9b9a5050505050505050505050565b60008151603014612a225760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a40161065d565b604051600290612a39908490600090602001614498565b60408051601f1981840301815290829052612a5391614359565b602060405180830381855afa158015612a70573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8d919061436b565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61181a82826131d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111699084906132ee565b835160208501516000919082612b4b8684876133c0565b6001600160401b0380821660208b0181905290891660408b0152909150612bc65760398054906000612b7c836142cb565b90915550506002606089015260405164ffffffffff8416906001600160401b038916907f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a90600090a35b84356000908152603660209081526040918290208a518154928c0151938c01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608b01518b9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612c6657612c66613b0a565b02179055505060405164ffffffffff851691506001600160401b038916907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3816001600160401b0316816001600160401b031614612d20576040805164ffffffffff851681526001600160401b03898116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612d1d8183613557565b93505b505050949350505050565b6060810151612ea0576000633b9aca0082604001518360200151612d4f91906142e2565b612d5991906144c7565b6020830151603480549293509091600090612d7e9084906001600160401b031661454c565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603b819055603c819055603d819055603e5560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603b556020810151603c556040810151603d5560600151603e55565b600083612ecc86858561356f565b1495945050505050565b60008060028351612ee7919061426f565b90506000816001600160401b03811115612f0357612f03613cb8565b604051908082528060200260200182016040528015612f2c578160200160208202803683370190505b50905060005b8281101561303357600285612f478383614323565b81518110612f5757612f576140b8565b602002602001015186836002612f6d9190614323565b612f78906001613f9e565b81518110612f8857612f886140b8565b6020026020010151604051602001612faa929190918252602082015260400190565b60408051601f1981840301815290829052612fc491614359565b602060405180830381855afa158015612fe1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190613004919061436b565b828281518110613016576130166140b8565b60209081029190910101528061302b816140f5565b915050612f32565b5061303f60028361426f565b91505b811561315f5760005b8281101561314c576002826130608383614323565b81518110613070576130706140b8565b6020026020010151838360026130869190614323565b613091906001613f9e565b815181106130a1576130a16140b8565b60200260200101516040516020016130c3929190918252602082015260400190565b60408051601f19818403018152908290526130dd91614359565b602060405180830381855afa1580156130fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061311d919061436b565b82828151811061312f5761312f6140b8565b602090810291909101015280613144816140f5565b91505061304b565b5061315860028361426f565b9150613042565b80600081518110613172576131726140b8565b602002602001015192505050919050565b6000610f8d8260068151811061319b5761319b6140b8565b60200260200101516136bb565b600081600181518110611d1b57611d1b6140b8565b6000610f8d8260028151811061319b5761319b6140b8565b804710156132255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161065d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613272576040519150601f19603f3d011682016040523d82523d6000602084013e613277565b606091505b50509050806111695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161065d565b6000613343826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137229092919063ffffffff16565b80519091501561116957808060200190518101906133619190613ec5565b6111695760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065d565b600060056133d060266001613f9e565b6133da9190613f9e565b6133e5906020614323565b6133f26040840184613fb6565b9050146134635760405162461bcd60e51b81526020600482015260446024820181905260008051602061463f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161065d565b6000613470600485614577565b64ffffffffff1690508061348660266001613f9e565b600c901b1790506134de61349d6040850185613fb6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992505050602086013584612ebe565b61353e5760405162461bcd60e51b815260206004820152603e602482015260008051602061463f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161065d565b61354c836020013585613731565b9150505b9392505050565b60006135506001600160401b0380841690851661459b565b6000835160001415801561358e57506020845161358c919061425b565b155b61361d5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161065d565b604080516020808201909252848152905b855181116136b15761364160028561425b565b613674578151600052808601516020526020826040600060026107d05a03fa61366957600080fd5b60028404935061369f565b8086015160005281516020526020826040600060026107d05a03fa61369857600080fd5b6002840493505b6136aa602082613f9e565b905061362e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e94848460008561375e565b60008061373f6004846145da565b61374a9060406145fe565b64ffffffffff169050611e9484821b6136bb565b6060824710156137bf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161065d565b6001600160a01b0385163b6138165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065d565b600080866001600160a01b031685876040516138329190614359565b60006040518083038185875af1925050503d806000811461386f576040519150601f19603f3d011682016040523d82523d6000602084013e613874565b606091505b509150915061388482828661388f565b979650505050505050565b6060831561389e575081613550565b8251156138ae5782518084602001fd5b8160405162461bcd60e51b815260040161065d919061462b565b80356001600160401b03811681146138df57600080fd5b919050565b6000604082840312156138f657600080fd5b50919050565b60008060006060848603121561391157600080fd5b61391a846138c8565b925060208401356001600160401b038082111561393657600080fd5b613942878388016138e4565b9350604086013591508082111561395857600080fd5b50613965868287016138e4565b9150509250925092565b60008083601f84011261398157600080fd5b5081356001600160401b0381111561399857600080fd5b6020830191508360208260051b85010111156139b357600080fd5b9250929050565b60008060008060008060008060a0898b0312156139d657600080fd5b6139df896138c8565b975060208901356001600160401b03808211156139fb57600080fd5b613a078c838d016138e4565b985060408b0135915080821115613a1d57600080fd5b613a298c838d0161396f565b909850965060608b0135915080821115613a4257600080fd5b613a4e8c838d0161396f565b909650945060808b0135915080821115613a6757600080fd5b50613a748b828c0161396f565b999c989b5096995094979396929594505050565b60008083601f840112613a9a57600080fd5b5081356001600160401b03811115613ab157600080fd5b6020830191508360208285010111156139b357600080fd5b60008060208385031215613adc57600080fd5b82356001600160401b03811115613af257600080fd5b613afe85828601613a88565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613b3e57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610f8d8284613b20565b600060208284031215613b6257600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613baa6060840182613b20565b5092915050565b8015158114610b0457600080fd5b600060208284031215613bd157600080fd5b813561355081613bb1565b600080600080600060608688031215613bf457600080fd5b85356001600160401b0380821115613c0b57600080fd5b613c1789838a01613a88565b90975095506020880135915080821115613c3057600080fd5b50613c3d88828901613a88565b96999598509660400135949350505050565b6001600160a01b0381168114610b0457600080fd5b80356138df81613c4f565b60008060408385031215613c8257600080fd5b8235613c8d81613c4f565b946020939093013593505050565b600060208284031215613cad57600080fd5b813561355081613c4f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cf657613cf6613cb8565b604052919050565b60006001600160401b03821115613d1757613d17613cb8565b5060051b60200190565b600082601f830112613d3257600080fd5b81356020613d47613d4283613cfe565b613cce565b82815260059290921b84018101918181019086841115613d6657600080fd5b8286015b84811015613d815780358352918301918301613d6a565b509695505050505050565b600080600060608486031215613da157600080fd5b83356001600160401b0380821115613db857600080fd5b818601915086601f830112613dcc57600080fd5b81356020613ddc613d4283613cfe565b82815260059290921b8401810191818101908a841115613dfb57600080fd5b948201945b83861015613e22578535613e1381613c4f565b82529482019490820190613e00565b97505087013592505080821115613e3857600080fd5b50613e4586828701613d21565b925050613e5460408501613c64565b90509250925092565b600080600060408486031215613e7257600080fd5b83356001600160401b0380821115613e8957600080fd5b613e95878388016138e4565b94506020860135915080821115613eab57600080fd5b50613eb88682870161396f565b9497909650939450505050565b600060208284031215613ed757600080fd5b815161355081613bb1565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e19843603018112613f5657600080fd5b8301803591506001600160401b03821115613f7057600080fd5b6020019150600581901b36038213156139b357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613fb157613fb1613f88565b500190565b6000808335601e19843603018112613fcd57600080fd5b8301803591506001600160401b03821115613fe757600080fd5b6020019150368190038213156139b357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252604e908201527f456967656e506f642e616674657252657374616b696e673a2074696d6573746160408201527f6d70206d757374206265206174206f722061667465722072657374616b696e6760608201526d081dd85cc81858dd1a5d985d195960921b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156140e057600080fd5b813564ffffffffff8116811461355057600080fd5b600060001982141561410957614109613f88565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156141a557818101518382015260200161418d565b838111156120925750506000910152565b600081518084526141ce81602086016020860161418a565b601f01601f19169290920160200192915050565b6080815260006141f660808301888a614161565b828103602084015261420881886141b6565b9050828103604084015261421d818688614161565b915050826060830152979650505050505050565b602081526000611e94602083018486614161565b634e487b7160e01b600052601260045260246000fd5b60008261426a5761426a614245565b500690565b60008261427e5761427e614245565b500490565b60006001600160401b03838116908316818110156142a3576142a3613f88565b039392505050565b60008235605e198336030181126142c157600080fd5b9190910192915050565b6000816142da576142da613f88565b506000190190565b600080821280156001600160ff1b038490038513161561430457614304613f88565b600160ff1b839003841281161561431d5761431d613f88565b50500190565b600081600019048311821515161561433d5761433d613f88565b500290565b60008282101561435457614354613f88565b500390565b600082516142c181846020870161418a565b60006020828403121561437d57600080fd5b5051919050565b600181815b808511156143bf5781600019048211156143a5576143a5613f88565b808516156143b257918102915b93841c9390800290614389565b509250929050565b6000826143d657506001610f8d565b816143e357506000610f8d565b81600181146143f957600281146144035761441f565b6001915050610f8d565b60ff84111561441457614414613f88565b50506001821b610f8d565b5060208310610133831016604e8410600b8410161715614442575081810a610f8d565b61444c8383614384565b806000190482111561446057614460613f88565b029392505050565b600061355083836143c7565b805160208083015191908110156138f65760001960209190910360031b1b16919050565b600083516144aa81846020880161418a565b6001600160801b0319939093169190920190815260100192915050565b60006001600160ff1b03818413828413808216868404861116156144ed576144ed613f88565b600160ff1b600087128281168783058912161561450c5761450c613f88565b6000871292508782058712848416161561452857614528613f88565b8785058712818416161561453e5761453e613f88565b505050929093029392505050565b60006001600160401b0380831681851680830382111561456e5761456e613f88565b01949350505050565b600064ffffffffff8084168061458f5761458f614245565b92169190910492915050565b60008083128015600160ff1b8501841216156145b9576145b9613f88565b6001600160ff1b03840183138116156145d4576145d4613f88565b50500390565b600064ffffffffff808416806145f2576145f2614245565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561462257614622613f88565b02949350505050565b60208152600061355060208301846141b656fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220bdd63a4b0a3fad7679855765d39fc608c8e09d9d5ad9ef81e6213b969b0ff93464736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. @@ -74,7 +79,7 @@ var EigenPodABI = EigenPodMetaData.ABI var EigenPodBin = EigenPodMetaData.Bin // DeployEigenPod deploys a new Ethereum contract, binding an instance of EigenPod to it. -func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _delayedWithdrawalRouter common.Address, _eigenPodManager common.Address, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR uint64, _GENESIS_TIME uint64) (common.Address, *types.Transaction, *EigenPod, error) { +func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _delayedWithdrawalRouter common.Address, _eigenPodManager common.Address, _GENESIS_TIME uint64) (common.Address, *types.Transaction, *EigenPod, error) { parsed, err := EigenPodMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -83,7 +88,7 @@ func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethP return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _GENESIS_TIME) if err != nil { return common.Address{}, nil, nil, err } @@ -263,12 +268,74 @@ func (_EigenPod *EigenPodCallerSession) GENESISTIME() (uint64, error) { return _EigenPod.Contract.GENESISTIME(&_EigenPod.CallOpts) } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPod *EigenPodCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _EigenPod.contract.Call(opts, &out, "activeValidatorCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPod *EigenPodSession) ActiveValidatorCount() (*big.Int, error) { + return _EigenPod.Contract.ActiveValidatorCount(&_EigenPod.CallOpts) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPod *EigenPodCallerSession) ActiveValidatorCount() (*big.Int, error) { + return _EigenPod.Contract.ActiveValidatorCount(&_EigenPod.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPod *EigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { + var out []interface{} + err := _EigenPod.contract.Call(opts, &out, "currentCheckpoint") + + if err != nil { + return *new(IEigenPodCheckpoint), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodCheckpoint)).(*IEigenPodCheckpoint) + + return out0, err + +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPod *EigenPodSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _EigenPod.Contract.CurrentCheckpoint(&_EigenPod.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPod *EigenPodCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _EigenPod.Contract.CurrentCheckpoint(&_EigenPod.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_EigenPod *EigenPodCaller) MAXRESTAKEDBALANCEGWEIPERVALIDATOR(opts *bind.CallOpts) (uint64, error) { +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR") + err := _EigenPod.contract.Call(opts, &out, "currentCheckpointTimestamp") if err != nil { return *new(uint64), err @@ -280,18 +347,18 @@ func (_EigenPod *EigenPodCaller) MAXRESTAKEDBALANCEGWEIPERVALIDATOR(opts *bind.C } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_EigenPod *EigenPodSession) MAXRESTAKEDBALANCEGWEIPERVALIDATOR() (uint64, error) { - return _EigenPod.Contract.MAXRESTAKEDBALANCEGWEIPERVALIDATOR(&_EigenPod.CallOpts) +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodSession) CurrentCheckpointTimestamp() (uint64, error) { + return _EigenPod.Contract.CurrentCheckpointTimestamp(&_EigenPod.CallOpts) } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_EigenPod *EigenPodCallerSession) MAXRESTAKEDBALANCEGWEIPERVALIDATOR() (uint64, error) { - return _EigenPod.Contract.MAXRESTAKEDBALANCEGWEIPERVALIDATOR(&_EigenPod.CallOpts) +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCallerSession) CurrentCheckpointTimestamp() (uint64, error) { + return _EigenPod.Contract.CurrentCheckpointTimestamp(&_EigenPod.CallOpts) } // DelayedWithdrawalRouter is a free data retrieval call binding the contract method 0x1a5057be. @@ -418,12 +485,12 @@ func (_EigenPod *EigenPodCallerSession) HasRestaked() (bool, error) { return _EigenPod.Contract.HasRestaked(&_EigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") + err := _EigenPod.contract.Call(opts, &out, "lastCheckpointTimestamp") if err != nil { return *new(uint64), err @@ -435,49 +502,49 @@ func (_EigenPod *EigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOp } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodSession) LastCheckpointTimestamp() (uint64, error) { + return _EigenPod.Contract.LastCheckpointTimestamp(&_EigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCallerSession) LastCheckpointTimestamp() (uint64, error) { + return _EigenPod.Contract.LastCheckpointTimestamp(&_EigenPod.CallOpts) } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_EigenPod *EigenPodCaller) NonBeaconChainETHBalanceWei(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "nonBeaconChainETHBalanceWei") + err := _EigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") if err != nil { - return *new(*big.Int), err + return *new(uint64), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_EigenPod *EigenPodSession) NonBeaconChainETHBalanceWei() (*big.Int, error) { - return _EigenPod.Contract.NonBeaconChainETHBalanceWei(&_EigenPod.CallOpts) +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPod *EigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_EigenPod *EigenPodCallerSession) NonBeaconChainETHBalanceWei() (*big.Int, error) { - return _EigenPod.Contract.NonBeaconChainETHBalanceWei(&_EigenPod.CallOpts) +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPod *EigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) } // PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. @@ -511,68 +578,6 @@ func (_EigenPod *EigenPodCallerSession) PodOwner() (common.Address, error) { return _EigenPod.Contract.PodOwner(&_EigenPod.CallOpts) } -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 , uint64 ) view returns(bool) -func (_EigenPod *EigenPodCaller) ProvenWithdrawal(opts *bind.CallOpts, arg0 [32]byte, arg1 uint64) (bool, error) { - var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "provenWithdrawal", arg0, arg1) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 , uint64 ) view returns(bool) -func (_EigenPod *EigenPodSession) ProvenWithdrawal(arg0 [32]byte, arg1 uint64) (bool, error) { - return _EigenPod.Contract.ProvenWithdrawal(&_EigenPod.CallOpts, arg0, arg1) -} - -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 , uint64 ) view returns(bool) -func (_EigenPod *EigenPodCallerSession) ProvenWithdrawal(arg0 [32]byte, arg1 uint64) (bool, error) { - return _EigenPod.Contract.ProvenWithdrawal(&_EigenPod.CallOpts, arg0, arg1) -} - -// SumOfPartialWithdrawalsClaimedGwei is a free data retrieval call binding the contract method 0x5d3f65b6. -// -// Solidity: function sumOfPartialWithdrawalsClaimedGwei() view returns(uint64) -func (_EigenPod *EigenPodCaller) SumOfPartialWithdrawalsClaimedGwei(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "sumOfPartialWithdrawalsClaimedGwei") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// SumOfPartialWithdrawalsClaimedGwei is a free data retrieval call binding the contract method 0x5d3f65b6. -// -// Solidity: function sumOfPartialWithdrawalsClaimedGwei() view returns(uint64) -func (_EigenPod *EigenPodSession) SumOfPartialWithdrawalsClaimedGwei() (uint64, error) { - return _EigenPod.Contract.SumOfPartialWithdrawalsClaimedGwei(&_EigenPod.CallOpts) -} - -// SumOfPartialWithdrawalsClaimedGwei is a free data retrieval call binding the contract method 0x5d3f65b6. -// -// Solidity: function sumOfPartialWithdrawalsClaimedGwei() view returns(uint64) -func (_EigenPod *EigenPodCallerSession) SumOfPartialWithdrawalsClaimedGwei() (uint64, error) { - return _EigenPod.Contract.SumOfPartialWithdrawalsClaimedGwei(&_EigenPod.CallOpts) -} - // ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. // // Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) @@ -812,109 +817,88 @@ func (_EigenPod *EigenPodTransactorSession) Stake(pubkey []byte, signature []byt return _EigenPod.Contract.Stake(&_EigenPod.TransactOpts, pubkey, signature, depositDataRoot) } -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_EigenPod *EigenPodTransactor) VerifyAndProcessWithdrawals(opts *bind.TransactOpts, oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "verifyAndProcessWithdrawals", oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_EigenPod *EigenPodSession) VerifyAndProcessWithdrawals(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyAndProcessWithdrawals(&_EigenPod.TransactOpts, oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_EigenPod *EigenPodTransactorSession) VerifyAndProcessWithdrawals(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyAndProcessWithdrawals(&_EigenPod.TransactOpts, oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodTransactor) VerifyBalanceUpdates(opts *bind.TransactOpts, oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "verifyBalanceUpdates", oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPod *EigenPodTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPod.contract.Transact(opts, "startCheckpoint", revertIfNoBalance) } -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodSession) VerifyBalanceUpdates(oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyBalanceUpdates(&_EigenPod.TransactOpts, oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPod *EigenPodSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPod.Contract.StartCheckpoint(&_EigenPod.TransactOpts, revertIfNoBalance) } -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodTransactorSession) VerifyBalanceUpdates(oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyBalanceUpdates(&_EigenPod.TransactOpts, oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPod *EigenPodTransactorSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPod.Contract.StartCheckpoint(&_EigenPod.TransactOpts, revertIfNoBalance) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "verifyWithdrawalCredentials", oracleTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodSession) VerifyWithdrawalCredentials(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyWithdrawalCredentials(&_EigenPod.TransactOpts, oracleTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, stateRootProof, proofs) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_EigenPod *EigenPodTransactorSession) VerifyWithdrawalCredentials(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyWithdrawalCredentials(&_EigenPod.TransactOpts, oracleTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, stateRootProof, proofs) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_EigenPod *EigenPodTransactor) WithdrawBeforeRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "withdrawBeforeRestaking") +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPod *EigenPodTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPod.contract.Transact(opts, "verifyStaleBalance", beaconTimestamp, stateRootProof, proof) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_EigenPod *EigenPodSession) WithdrawBeforeRestaking() (*types.Transaction, error) { - return _EigenPod.Contract.WithdrawBeforeRestaking(&_EigenPod.TransactOpts) +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPod *EigenPodSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyStaleBalance(&_EigenPod.TransactOpts, beaconTimestamp, stateRootProof, proof) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_EigenPod *EigenPodTransactorSession) WithdrawBeforeRestaking() (*types.Transaction, error) { - return _EigenPod.Contract.WithdrawBeforeRestaking(&_EigenPod.TransactOpts) +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPod *EigenPodTransactorSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyStaleBalance(&_EigenPod.TransactOpts, beaconTimestamp, stateRootProof, proof) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_EigenPod *EigenPodTransactor) WithdrawNonBeaconChainETHBalanceWei(opts *bind.TransactOpts, recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "withdrawNonBeaconChainETHBalanceWei", recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPod *EigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPod.contract.Transact(opts, "verifyWithdrawalCredentials", beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_EigenPod *EigenPodSession) WithdrawNonBeaconChainETHBalanceWei(recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _EigenPod.Contract.WithdrawNonBeaconChainETHBalanceWei(&_EigenPod.TransactOpts, recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPod *EigenPodSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyWithdrawalCredentials(&_EigenPod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_EigenPod *EigenPodTransactorSession) WithdrawNonBeaconChainETHBalanceWei(recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _EigenPod.Contract.WithdrawNonBeaconChainETHBalanceWei(&_EigenPod.TransactOpts, recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPod *EigenPodTransactorSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyWithdrawalCredentials(&_EigenPod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } // WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. @@ -959,9 +943,9 @@ func (_EigenPod *EigenPodTransactorSession) Receive() (*types.Transaction, error return _EigenPod.Contract.Receive(&_EigenPod.TransactOpts) } -// EigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the EigenPod contract. -type EigenPodEigenPodStakedIterator struct { - Event *EigenPodEigenPodStaked // Event containing the contract specifics and raw log +// EigenPodCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the EigenPod contract. +type EigenPodCheckpointCreatedIterator struct { + Event *EigenPodCheckpointCreated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -975,7 +959,7 @@ type EigenPodEigenPodStakedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodEigenPodStakedIterator) Next() bool { +func (it *EigenPodCheckpointCreatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -984,7 +968,7 @@ func (it *EigenPodEigenPodStakedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodEigenPodStaked) + it.Event = new(EigenPodCheckpointCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -999,7 +983,7 @@ func (it *EigenPodEigenPodStakedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodEigenPodStaked) + it.Event = new(EigenPodCheckpointCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1015,41 +999,60 @@ func (it *EigenPodEigenPodStakedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodEigenPodStakedIterator) Error() error { +func (it *EigenPodCheckpointCreatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodEigenPodStakedIterator) Close() error { +func (it *EigenPodCheckpointCreatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodEigenPodStaked represents a EigenPodStaked event raised by the EigenPod contract. -type EigenPodEigenPodStaked struct { - Pubkey []byte - Raw types.Log // Blockchain specific contextual infos +// EigenPodCheckpointCreated represents a CheckpointCreated event raised by the EigenPod contract. +type EigenPodCheckpointCreated struct { + CheckpointTimestamp uint64 + BeaconBlockRoot [32]byte + Raw types.Log // Blockchain specific contextual infos } -// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_EigenPod *EigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*EigenPodEigenPodStakedIterator, error) { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPod *EigenPodFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*EigenPodCheckpointCreatedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "EigenPodStaked") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) if err != nil { return nil, err } - return &EigenPodEigenPodStakedIterator{contract: _EigenPod.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil + return &EigenPodCheckpointCreatedIterator{contract: _EigenPod.contract, event: "CheckpointCreated", logs: logs, sub: sub}, nil } -// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_EigenPod *EigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *EigenPodEigenPodStaked) (event.Subscription, error) { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPod *EigenPodFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *EigenPodCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "EigenPodStaked") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) if err != nil { return nil, err } @@ -1059,8 +1062,8 @@ func (_EigenPod *EigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sin select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodEigenPodStaked) - if err := _EigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { + event := new(EigenPodCheckpointCreated) + if err := _EigenPod.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { return err } event.Raw = log @@ -1081,21 +1084,21 @@ func (_EigenPod *EigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sin }), nil } -// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// ParseCheckpointCreated is a log parse operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_EigenPod *EigenPodFilterer) ParseEigenPodStaked(log types.Log) (*EigenPodEigenPodStaked, error) { - event := new(EigenPodEigenPodStaked) - if err := _EigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPod *EigenPodFilterer) ParseCheckpointCreated(log types.Log) (*EigenPodCheckpointCreated, error) { + event := new(EigenPodCheckpointCreated) + if err := _EigenPod.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodFullWithdrawalRedeemedIterator is returned from FilterFullWithdrawalRedeemed and is used to iterate over the raw logs and unpacked data for FullWithdrawalRedeemed events raised by the EigenPod contract. -type EigenPodFullWithdrawalRedeemedIterator struct { - Event *EigenPodFullWithdrawalRedeemed // Event containing the contract specifics and raw log +// EigenPodCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the EigenPod contract. +type EigenPodCheckpointFinalizedIterator struct { + Event *EigenPodCheckpointFinalized // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1109,7 +1112,7 @@ type EigenPodFullWithdrawalRedeemedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodFullWithdrawalRedeemedIterator) Next() bool { +func (it *EigenPodCheckpointFinalizedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1118,7 +1121,7 @@ func (it *EigenPodFullWithdrawalRedeemedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodFullWithdrawalRedeemed) + it.Event = new(EigenPodCheckpointFinalized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1133,7 +1136,7 @@ func (it *EigenPodFullWithdrawalRedeemedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodFullWithdrawalRedeemed) + it.Event = new(EigenPodCheckpointFinalized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1149,54 +1152,52 @@ func (it *EigenPodFullWithdrawalRedeemedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodFullWithdrawalRedeemedIterator) Error() error { +func (it *EigenPodCheckpointFinalizedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodFullWithdrawalRedeemedIterator) Close() error { +func (it *EigenPodCheckpointFinalizedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodFullWithdrawalRedeemed represents a FullWithdrawalRedeemed event raised by the EigenPod contract. -type EigenPodFullWithdrawalRedeemed struct { - ValidatorIndex *big.Int - WithdrawalTimestamp uint64 - Recipient common.Address - WithdrawalAmountGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// EigenPodCheckpointFinalized represents a CheckpointFinalized event raised by the EigenPod contract. +type EigenPodCheckpointFinalized struct { + CheckpointTimestamp uint64 + TotalShareDeltaWei *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterFullWithdrawalRedeemed is a free log retrieval operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) FilterFullWithdrawalRedeemed(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodFullWithdrawalRedeemedIterator, error) { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPod *EigenPodFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*EigenPodCheckpointFinalizedIterator, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) } - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "FullWithdrawalRedeemed", recipientRule) + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "CheckpointFinalized", checkpointTimestampRule) if err != nil { return nil, err } - return &EigenPodFullWithdrawalRedeemedIterator{contract: _EigenPod.contract, event: "FullWithdrawalRedeemed", logs: logs, sub: sub}, nil + return &EigenPodCheckpointFinalizedIterator{contract: _EigenPod.contract, event: "CheckpointFinalized", logs: logs, sub: sub}, nil } -// WatchFullWithdrawalRedeemed is a free log subscription operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.WatchOpts, sink chan<- *EigenPodFullWithdrawalRedeemed, recipient []common.Address) (event.Subscription, error) { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPod *EigenPodFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *EigenPodCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) } - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "FullWithdrawalRedeemed", recipientRule) + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "CheckpointFinalized", checkpointTimestampRule) if err != nil { return nil, err } @@ -1206,8 +1207,8 @@ func (_EigenPod *EigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.WatchO select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodFullWithdrawalRedeemed) - if err := _EigenPod.contract.UnpackLog(event, "FullWithdrawalRedeemed", log); err != nil { + event := new(EigenPodCheckpointFinalized) + if err := _EigenPod.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { return err } event.Raw = log @@ -1228,21 +1229,21 @@ func (_EigenPod *EigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.WatchO }), nil } -// ParseFullWithdrawalRedeemed is a log parse operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) ParseFullWithdrawalRedeemed(log types.Log) (*EigenPodFullWithdrawalRedeemed, error) { - event := new(EigenPodFullWithdrawalRedeemed) - if err := _EigenPod.contract.UnpackLog(event, "FullWithdrawalRedeemed", log); err != nil { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPod *EigenPodFilterer) ParseCheckpointFinalized(log types.Log) (*EigenPodCheckpointFinalized, error) { + event := new(EigenPodCheckpointFinalized) + if err := _EigenPod.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenPod contract. -type EigenPodInitializedIterator struct { - Event *EigenPodInitialized // Event containing the contract specifics and raw log +// EigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the EigenPod contract. +type EigenPodEigenPodStakedIterator struct { + Event *EigenPodEigenPodStaked // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1256,7 +1257,7 @@ type EigenPodInitializedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodInitializedIterator) Next() bool { +func (it *EigenPodEigenPodStakedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1265,7 +1266,7 @@ func (it *EigenPodInitializedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodInitialized) + it.Event = new(EigenPodEigenPodStaked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1280,7 +1281,7 @@ func (it *EigenPodInitializedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodInitialized) + it.Event = new(EigenPodEigenPodStaked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1296,41 +1297,41 @@ func (it *EigenPodInitializedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodInitializedIterator) Error() error { +func (it *EigenPodEigenPodStakedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodInitializedIterator) Close() error { +func (it *EigenPodEigenPodStakedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodInitialized represents a Initialized event raised by the EigenPod contract. -type EigenPodInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos +// EigenPodEigenPodStaked represents a EigenPodStaked event raised by the EigenPod contract. +type EigenPodEigenPodStaked struct { + Pubkey []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event Initialized(uint8 version) -func (_EigenPod *EigenPodFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenPodInitializedIterator, error) { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPod *EigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*EigenPodEigenPodStakedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "Initialized") + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "EigenPodStaked") if err != nil { return nil, err } - return &EigenPodInitializedIterator{contract: _EigenPod.contract, event: "Initialized", logs: logs, sub: sub}, nil + return &EigenPodEigenPodStakedIterator{contract: _EigenPod.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil } -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event Initialized(uint8 version) -func (_EigenPod *EigenPodFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenPodInitialized) (event.Subscription, error) { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPod *EigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *EigenPodEigenPodStaked) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "Initialized") + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "EigenPodStaked") if err != nil { return nil, err } @@ -1340,8 +1341,8 @@ func (_EigenPod *EigenPodFilterer) WatchInitialized(opts *bind.WatchOpts, sink c select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodInitialized) - if err := _EigenPod.contract.UnpackLog(event, "Initialized", log); err != nil { + event := new(EigenPodEigenPodStaked) + if err := _EigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { return err } event.Raw = log @@ -1362,21 +1363,21 @@ func (_EigenPod *EigenPodFilterer) WatchInitialized(opts *bind.WatchOpts, sink c }), nil } -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event Initialized(uint8 version) -func (_EigenPod *EigenPodFilterer) ParseInitialized(log types.Log) (*EigenPodInitialized, error) { - event := new(EigenPodInitialized) - if err := _EigenPod.contract.UnpackLog(event, "Initialized", log); err != nil { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPod *EigenPodFilterer) ParseEigenPodStaked(log types.Log) (*EigenPodEigenPodStaked, error) { + event := new(EigenPodEigenPodStaked) + if err := _EigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the EigenPod contract. -type EigenPodNonBeaconChainETHReceivedIterator struct { - Event *EigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log +// EigenPodInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenPod contract. +type EigenPodInitializedIterator struct { + Event *EigenPodInitialized // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1390,7 +1391,7 @@ type EigenPodNonBeaconChainETHReceivedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodNonBeaconChainETHReceivedIterator) Next() bool { +func (it *EigenPodInitializedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1399,7 +1400,7 @@ func (it *EigenPodNonBeaconChainETHReceivedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodNonBeaconChainETHReceived) + it.Event = new(EigenPodInitialized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1414,7 +1415,7 @@ func (it *EigenPodNonBeaconChainETHReceivedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodNonBeaconChainETHReceived) + it.Event = new(EigenPodInitialized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1430,41 +1431,41 @@ func (it *EigenPodNonBeaconChainETHReceivedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodNonBeaconChainETHReceivedIterator) Error() error { +func (it *EigenPodInitializedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodNonBeaconChainETHReceivedIterator) Close() error { +func (it *EigenPodInitializedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the EigenPod contract. -type EigenPodNonBeaconChainETHReceived struct { - AmountReceived *big.Int - Raw types.Log // Blockchain specific contextual infos +// EigenPodInitialized represents a Initialized event raised by the EigenPod contract. +type EigenPodInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos } -// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_EigenPod *EigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*EigenPodNonBeaconChainETHReceivedIterator, error) { +// Solidity: event Initialized(uint8 version) +func (_EigenPod *EigenPodFilterer) FilterInitialized(opts *bind.FilterOpts) (*EigenPodInitializedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "NonBeaconChainETHReceived") + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "Initialized") if err != nil { return nil, err } - return &EigenPodNonBeaconChainETHReceivedIterator{contract: _EigenPod.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil + return &EigenPodInitializedIterator{contract: _EigenPod.contract, event: "Initialized", logs: logs, sub: sub}, nil } -// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *EigenPodNonBeaconChainETHReceived) (event.Subscription, error) { +// Solidity: event Initialized(uint8 version) +func (_EigenPod *EigenPodFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *EigenPodInitialized) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "NonBeaconChainETHReceived") + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "Initialized") if err != nil { return nil, err } @@ -1474,8 +1475,8 @@ func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.Wat select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodNonBeaconChainETHReceived) - if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { + event := new(EigenPodInitialized) + if err := _EigenPod.contract.UnpackLog(event, "Initialized", log); err != nil { return err } event.Raw = log @@ -1496,21 +1497,21 @@ func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.Wat }), nil } -// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_EigenPod *EigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*EigenPodNonBeaconChainETHReceived, error) { - event := new(EigenPodNonBeaconChainETHReceived) - if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { +// Solidity: event Initialized(uint8 version) +func (_EigenPod *EigenPodFilterer) ParseInitialized(log types.Log) (*EigenPodInitialized, error) { + event := new(EigenPodInitialized) + if err := _EigenPod.contract.UnpackLog(event, "Initialized", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodNonBeaconChainETHWithdrawnIterator is returned from FilterNonBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHWithdrawn events raised by the EigenPod contract. -type EigenPodNonBeaconChainETHWithdrawnIterator struct { - Event *EigenPodNonBeaconChainETHWithdrawn // Event containing the contract specifics and raw log +// EigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the EigenPod contract. +type EigenPodNonBeaconChainETHReceivedIterator struct { + Event *EigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1524,7 +1525,7 @@ type EigenPodNonBeaconChainETHWithdrawnIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { +func (it *EigenPodNonBeaconChainETHReceivedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1533,7 +1534,7 @@ func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodNonBeaconChainETHWithdrawn) + it.Event = new(EigenPodNonBeaconChainETHReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1548,7 +1549,7 @@ func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodNonBeaconChainETHWithdrawn) + it.Event = new(EigenPodNonBeaconChainETHReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1564,52 +1565,41 @@ func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Error() error { +func (it *EigenPodNonBeaconChainETHReceivedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodNonBeaconChainETHWithdrawnIterator) Close() error { +func (it *EigenPodNonBeaconChainETHReceivedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodNonBeaconChainETHWithdrawn represents a NonBeaconChainETHWithdrawn event raised by the EigenPod contract. -type EigenPodNonBeaconChainETHWithdrawn struct { - Recipient common.Address - AmountWithdrawn *big.Int - Raw types.Log // Blockchain specific contextual infos +// EigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the EigenPod contract. +type EigenPodNonBeaconChainETHReceived struct { + AmountReceived *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterNonBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_EigenPod *EigenPodFilterer) FilterNonBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodNonBeaconChainETHWithdrawnIterator, error) { - - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) - } +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPod *EigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*EigenPodNonBeaconChainETHReceivedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "NonBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "NonBeaconChainETHReceived") if err != nil { return nil, err } - return &EigenPodNonBeaconChainETHWithdrawnIterator{contract: _EigenPod.contract, event: "NonBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil + return &EigenPodNonBeaconChainETHReceivedIterator{contract: _EigenPod.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil } -// WatchNonBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodNonBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { - - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) - } +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *EigenPodNonBeaconChainETHReceived) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "NonBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "NonBeaconChainETHReceived") if err != nil { return nil, err } @@ -1619,8 +1609,8 @@ func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind.Wa select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodNonBeaconChainETHWithdrawn) - if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHWithdrawn", log); err != nil { + event := new(EigenPodNonBeaconChainETHReceived) + if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { return err } event.Raw = log @@ -1641,21 +1631,21 @@ func (_EigenPod *EigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind.Wa }), nil } -// ParseNonBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_EigenPod *EigenPodFilterer) ParseNonBeaconChainETHWithdrawn(log types.Log) (*EigenPodNonBeaconChainETHWithdrawn, error) { - event := new(EigenPodNonBeaconChainETHWithdrawn) - if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHWithdrawn", log); err != nil { +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPod *EigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*EigenPodNonBeaconChainETHReceived, error) { + event := new(EigenPodNonBeaconChainETHReceived) + if err := _EigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodPartialWithdrawalRedeemedIterator is returned from FilterPartialWithdrawalRedeemed and is used to iterate over the raw logs and unpacked data for PartialWithdrawalRedeemed events raised by the EigenPod contract. -type EigenPodPartialWithdrawalRedeemedIterator struct { - Event *EigenPodPartialWithdrawalRedeemed // Event containing the contract specifics and raw log +// EigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the EigenPod contract. +type EigenPodRestakedBeaconChainETHWithdrawnIterator struct { + Event *EigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1669,7 +1659,7 @@ type EigenPodPartialWithdrawalRedeemedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodPartialWithdrawalRedeemedIterator) Next() bool { +func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1678,7 +1668,7 @@ func (it *EigenPodPartialWithdrawalRedeemedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodPartialWithdrawalRedeemed) + it.Event = new(EigenPodRestakedBeaconChainETHWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1693,7 +1683,7 @@ func (it *EigenPodPartialWithdrawalRedeemedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodPartialWithdrawalRedeemed) + it.Event = new(EigenPodRestakedBeaconChainETHWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1709,54 +1699,52 @@ func (it *EigenPodPartialWithdrawalRedeemedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodPartialWithdrawalRedeemedIterator) Error() error { +func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodPartialWithdrawalRedeemedIterator) Close() error { +func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodPartialWithdrawalRedeemed represents a PartialWithdrawalRedeemed event raised by the EigenPod contract. -type EigenPodPartialWithdrawalRedeemed struct { - ValidatorIndex *big.Int - WithdrawalTimestamp uint64 - Recipient common.Address - PartialWithdrawalAmountGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// EigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the EigenPod contract. +type EigenPodRestakedBeaconChainETHWithdrawn struct { + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterPartialWithdrawalRedeemed is a free log retrieval operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) FilterPartialWithdrawalRedeemed(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodPartialWithdrawalRedeemedIterator, error) { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPod *EigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodRestakedBeaconChainETHWithdrawnIterator, error) { var recipientRule []interface{} for _, recipientItem := range recipient { recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "PartialWithdrawalRedeemed", recipientRule) + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) if err != nil { return nil, err } - return &EigenPodPartialWithdrawalRedeemedIterator{contract: _EigenPod.contract, event: "PartialWithdrawalRedeemed", logs: logs, sub: sub}, nil + return &EigenPodRestakedBeaconChainETHWithdrawnIterator{contract: _EigenPod.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil } -// WatchPartialWithdrawalRedeemed is a free log subscription operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.WatchOpts, sink chan<- *EigenPodPartialWithdrawalRedeemed, recipient []common.Address) (event.Subscription, error) { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPod *EigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { var recipientRule []interface{} for _, recipientItem := range recipient { recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "PartialWithdrawalRedeemed", recipientRule) + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) if err != nil { return nil, err } @@ -1766,8 +1754,8 @@ func (_EigenPod *EigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.Wat select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodPartialWithdrawalRedeemed) - if err := _EigenPod.contract.UnpackLog(event, "PartialWithdrawalRedeemed", log); err != nil { + event := new(EigenPodRestakedBeaconChainETHWithdrawn) + if err := _EigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { return err } event.Raw = log @@ -1788,21 +1776,21 @@ func (_EigenPod *EigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.Wat }), nil } -// ParsePartialWithdrawalRedeemed is a log parse operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_EigenPod *EigenPodFilterer) ParsePartialWithdrawalRedeemed(log types.Log) (*EigenPodPartialWithdrawalRedeemed, error) { - event := new(EigenPodPartialWithdrawalRedeemed) - if err := _EigenPod.contract.UnpackLog(event, "PartialWithdrawalRedeemed", log); err != nil { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPod *EigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*EigenPodRestakedBeaconChainETHWithdrawn, error) { + event := new(EigenPodRestakedBeaconChainETHWithdrawn) + if err := _EigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the EigenPod contract. -type EigenPodRestakedBeaconChainETHWithdrawnIterator struct { - Event *EigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log +// EigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the EigenPod contract. +type EigenPodRestakingActivatedIterator struct { + Event *EigenPodRestakingActivated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1816,7 +1804,7 @@ type EigenPodRestakedBeaconChainETHWithdrawnIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { +func (it *EigenPodRestakingActivatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1825,7 +1813,7 @@ func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodRestakedBeaconChainETHWithdrawn) + it.Event = new(EigenPodRestakingActivated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1840,7 +1828,7 @@ func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodRestakedBeaconChainETHWithdrawn) + it.Event = new(EigenPodRestakingActivated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1856,52 +1844,51 @@ func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Error() error { +func (it *EigenPodRestakingActivatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodRestakedBeaconChainETHWithdrawnIterator) Close() error { +func (it *EigenPodRestakingActivatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the EigenPod contract. -type EigenPodRestakedBeaconChainETHWithdrawn struct { - Recipient common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos +// EigenPodRestakingActivated represents a RestakingActivated event raised by the EigenPod contract. +type EigenPodRestakingActivated struct { + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_EigenPod *EigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodRestakedBeaconChainETHWithdrawnIterator, error) { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPod *EigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodRestakingActivatedIterator, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) } - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) if err != nil { return nil, err } - return &EigenPodRestakedBeaconChainETHWithdrawnIterator{contract: _EigenPod.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil + return &EigenPodRestakingActivatedIterator{contract: _EigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil } -// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_EigenPod *EigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPod *EigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *EigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) } - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) if err != nil { return nil, err } @@ -1911,8 +1898,8 @@ func (_EigenPod *EigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bi select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodRestakedBeaconChainETHWithdrawn) - if err := _EigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { + event := new(EigenPodRestakingActivated) + if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { return err } event.Raw = log @@ -1933,21 +1920,21 @@ func (_EigenPod *EigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bi }), nil } -// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_EigenPod *EigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*EigenPodRestakedBeaconChainETHWithdrawn, error) { - event := new(EigenPodRestakedBeaconChainETHWithdrawn) - if err := _EigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPod *EigenPodFilterer) ParseRestakingActivated(log types.Log) (*EigenPodRestakingActivated, error) { + event := new(EigenPodRestakingActivated) + if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the EigenPod contract. -type EigenPodRestakingActivatedIterator struct { - Event *EigenPodRestakingActivated // Event containing the contract specifics and raw log +// EigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPod contract. +type EigenPodValidatorBalanceUpdatedIterator struct { + Event *EigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1961,7 +1948,7 @@ type EigenPodRestakingActivatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodRestakingActivatedIterator) Next() bool { +func (it *EigenPodValidatorBalanceUpdatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1970,7 +1957,7 @@ func (it *EigenPodRestakingActivatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodRestakingActivated) + it.Event = new(EigenPodValidatorBalanceUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1985,7 +1972,7 @@ func (it *EigenPodRestakingActivatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodRestakingActivated) + it.Event = new(EigenPodValidatorBalanceUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2001,51 +1988,43 @@ func (it *EigenPodRestakingActivatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodRestakingActivatedIterator) Error() error { +func (it *EigenPodValidatorBalanceUpdatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodRestakingActivatedIterator) Close() error { +func (it *EigenPodValidatorBalanceUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodRestakingActivated represents a RestakingActivated event raised by the EigenPod contract. -type EigenPodRestakingActivated struct { - PodOwner common.Address - Raw types.Log // Blockchain specific contextual infos +// EigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the EigenPod contract. +type EigenPodValidatorBalanceUpdated struct { + ValidatorIndex *big.Int + BalanceTimestamp uint64 + NewValidatorBalanceGwei uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodRestakingActivatedIterator, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPod *EigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*EigenPodValidatorBalanceUpdatedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "ValidatorBalanceUpdated") if err != nil { return nil, err } - return &EigenPodRestakingActivatedIterator{contract: _EigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil + return &EigenPodValidatorBalanceUpdatedIterator{contract: _EigenPod.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil } -// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *EigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPod *EigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorBalanceUpdated) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "ValidatorBalanceUpdated") if err != nil { return nil, err } @@ -2055,8 +2034,8 @@ func (_EigenPod *EigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodRestakingActivated) - if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { + event := new(EigenPodValidatorBalanceUpdated) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { return err } event.Raw = log @@ -2077,21 +2056,21 @@ func (_EigenPod *EigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, }), nil } -// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) ParseRestakingActivated(log types.Log) (*EigenPodRestakingActivated, error) { - event := new(EigenPodRestakingActivated) - if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPod *EigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*EigenPodValidatorBalanceUpdated, error) { + event := new(EigenPodValidatorBalanceUpdated) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// EigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPod contract. -type EigenPodValidatorBalanceUpdatedIterator struct { - Event *EigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log +// EigenPodValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the EigenPod contract. +type EigenPodValidatorCheckpointedIterator struct { + Event *EigenPodValidatorCheckpointed // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -2105,7 +2084,7 @@ type EigenPodValidatorBalanceUpdatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *EigenPodValidatorBalanceUpdatedIterator) Next() bool { +func (it *EigenPodValidatorCheckpointedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -2114,7 +2093,7 @@ func (it *EigenPodValidatorBalanceUpdatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EigenPodValidatorBalanceUpdated) + it.Event = new(EigenPodValidatorCheckpointed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2129,7 +2108,7 @@ func (it *EigenPodValidatorBalanceUpdatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(EigenPodValidatorBalanceUpdated) + it.Event = new(EigenPodValidatorCheckpointed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -2145,43 +2124,60 @@ func (it *EigenPodValidatorBalanceUpdatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodValidatorBalanceUpdatedIterator) Error() error { +func (it *EigenPodValidatorCheckpointedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *EigenPodValidatorBalanceUpdatedIterator) Close() error { +func (it *EigenPodValidatorCheckpointedIterator) Close() error { it.sub.Unsubscribe() return nil } -// EigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the EigenPod contract. -type EigenPodValidatorBalanceUpdated struct { - ValidatorIndex *big.Int - BalanceTimestamp uint64 - NewValidatorBalanceGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// EigenPodValidatorCheckpointed represents a ValidatorCheckpointed event raised by the EigenPod contract. +type EigenPodValidatorCheckpointed struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_EigenPod *EigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*EigenPodValidatorBalanceUpdatedIterator, error) { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*EigenPodValidatorCheckpointedIterator, error) { - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "ValidatorBalanceUpdated") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) if err != nil { return nil, err } - return &EigenPodValidatorBalanceUpdatedIterator{contract: _EigenPod.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil + return &EigenPodValidatorCheckpointedIterator{contract: _EigenPod.contract, event: "ValidatorCheckpointed", logs: logs, sub: sub}, nil } -// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_EigenPod *EigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorBalanceUpdated) (event.Subscription, error) { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorCheckpointed, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "ValidatorBalanceUpdated") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) if err != nil { return nil, err } @@ -2191,8 +2187,8 @@ func (_EigenPod *EigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.Watch select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(EigenPodValidatorBalanceUpdated) - if err := _EigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { + event := new(EigenPodValidatorCheckpointed) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { return err } event.Raw = log @@ -2213,12 +2209,12 @@ func (_EigenPod *EigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.Watch }), nil } -// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_EigenPod *EigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*EigenPodValidatorBalanceUpdated, error) { - event := new(EigenPodValidatorBalanceUpdated) - if err := _EigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) ParseValidatorCheckpointed(log types.Log) (*EigenPodValidatorCheckpointed, error) { + event := new(EigenPodValidatorCheckpointed) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { return nil, err } event.Raw = log @@ -2358,3 +2354,156 @@ func (_EigenPod *EigenPodFilterer) ParseValidatorRestaked(log types.Log) (*Eigen event.Raw = log return event, nil } + +// EigenPodValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the EigenPod contract. +type EigenPodValidatorWithdrawnIterator struct { + Event *EigenPodValidatorWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodValidatorWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodValidatorWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodValidatorWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodValidatorWithdrawn represents a ValidatorWithdrawn event raised by the EigenPod contract. +type EigenPodValidatorWithdrawn struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*EigenPodValidatorWithdrawnIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPod.contract.FilterLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &EigenPodValidatorWithdrawnIterator{contract: _EigenPod.contract, event: "ValidatorWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodValidatorWithdrawn, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPod.contract.WatchLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodValidatorWithdrawn) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPod *EigenPodFilterer) ParseValidatorWithdrawn(log types.Log) (*EigenPodValidatorWithdrawn, error) { + event := new(EigenPodValidatorWithdrawn) + if err := _EigenPod.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index 850615592..ec966f0ab 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -31,8 +31,8 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"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\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"getBlockRootAtTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_beaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateBeaconChainOracle\",\"inputs\":[{\"name\":\"newBeaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"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\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220993099995037915be5ad8d608a233d61ec8d8c9832ccafaf133f657cff5c440264736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"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\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101206040523480156200001257600080fd5b506040516200328c3803806200328c83398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e0516101005161304b62000241600039600081816105b50152818161065f01528181610bac015281816114850152818161190901526119f901526000610541015260006102e5015260008181610279015281816114040152611f7d01526000610413015261304b6000f3fe6080604052600436106101cd5760003560e01c806384d81062116100f7578063a6a509be11610095578063ea4d3c9b11610064578063ea4d3c9b146105a3578063f2fde38b146105d7578063f6848d24146105f7578063fabc1cbc1461063257600080fd5b8063a6a509be14610519578063b13442711461052f578063beffbb8914610563578063c2c51c401461058357600080fd5b80639104c319116100d15780639104c319146104885780639b4e4634146104b05780639ba06275146104c3578063a38406a3146104f957600080fd5b806384d8106214610435578063886f11951461044a5780638da5cb5b1461046a57600080fd5b806344e71c801161016f5780635c975abb1161013e5780635c975abb146103aa57806360f4062b146103bf578063715018a6146103ec57806374cdd7981461040157600080fd5b806344e71c8014610307578063463db03814610335578063595c6a67146103555780635ac86ab71461036a57600080fd5b80631794bb3c116101ab5780631794bb3c14610247578063292b7b2b14610267578063387b1300146102b357806339b70e38146102d357600080fd5b80630e81073c146101d257806310d67a2f14610205578063136439dd14610227575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612215565b610652565b6040519081526020015b60405180910390f35b34801561021157600080fd5b50610225610220366004612241565b610890565b005b34801561023357600080fd5b5061022561024236600461225e565b610943565b34801561025357600080fd5b50610225610262366004612277565b610a82565b34801561027357600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fc565b3480156102bf57600080fd5b506102256102ce366004612277565b610ba1565b3480156102df57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031357600080fd5b5061031c610f3f565b60405167ffffffffffffffff90911681526020016101fc565b34801561034157600080fd5b506102256103503660046122b8565b610f68565b34801561036157600080fd5b506102256110f4565b34801561037657600080fd5b5061039a6103853660046122e2565b606654600160ff9092169190911b9081161490565b60405190151581526020016101fc565b3480156103b657600080fd5b506066546101f2565b3480156103cb57600080fd5b506101f26103da366004612241565b609b6020526000908152604090205481565b3480156103f857600080fd5b506102256111bb565b34801561040d57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044157600080fd5b5061029b6111cf565b34801561045657600080fd5b5060655461029b906001600160a01b031681565b34801561047657600080fd5b506033546001600160a01b031661029b565b34801561049457600080fd5b5061029b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102256104be36600461234e565b6112b9565b3480156104cf57600080fd5b5061029b6104de366004612241565b6098602052600090815260409020546001600160a01b031681565b34801561050557600080fd5b5061029b610514366004612241565b6113a8565b34801561052557600080fd5b506101f260995481565b34801561053b57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056f57600080fd5b5061022561057e366004612215565b61147a565b34801561058f57600080fd5b5061022561059e366004612215565b611691565b3480156105af57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506102256105f2366004612241565b611a94565b34801561060357600080fd5b5061039a610612366004612241565b6001600160a01b0390811660009081526098602052604090205416151590565b34801561063e57600080fd5b5061022561064d36600461225e565b611b0a565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106a55760405162461bcd60e51b815260040161069c906123c2565b60405180910390fd5b6001600160a01b0383166107215760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161069c565b600082121561078f5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161069c565b61079d633b9aca0083612436565b156108105760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161069c565b6001600160a01b0383166000908152609b6020526040812054906108348483612460565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612fd6833981519152906108739087815260200190565b60405180910390a26108858282611c66565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090791906124a1565b6001600160a01b0316336001600160a01b0316146109375760405162461bcd60e51b815260040161069c906124be565b61094081611ca8565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190612508565b6109cb5760405162461bcd60e51b815260040161069c9061252a565b60665481811614610a445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161069c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610aa25750600054600160ff909116105b80610abc5750303b158015610abc575060005460ff166001145b610b1f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161069c565b6000805460ff191660011790558015610b42576000805461ff0019166101001790555b610b4b84611d9f565b610b558383611df1565b8015610b9b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be95760405162461bcd60e51b815260040161069c906123c2565b6001600160a01b038316610c635760405162461bcd60e51b81526020600482015260476024820152600080516020612ff683398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161069c565b6001600160a01b038216610ce05760405162461bcd60e51b815260206004820152604a6024820152600080516020612ff683398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161069c565b6000811215610d4f5760405162461bcd60e51b81526020600482015260416024820152600080516020612ff683398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161069c565b610d5d633b9aca0082612436565b15610dd15760405162461bcd60e51b815260206004820152604a6024820152600080516020612ff683398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161069c565b6001600160a01b0383166000908152609b602052604081205490811215610ec4576000610dfd82612572565b905080831115610e62576001600160a01b0385166000908152609b6020526040812055610e2a818461258f565b9250846001600160a01b0316600080516020612fd683398151915282604051610e5591815260200190565b60405180910390a2610ec2565b6001600160a01b0385166000908152609b602052604081208054859290610e8a908490612460565b90915550506040518381526001600160a01b03861690600080516020612fd68339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610f635767ffffffffffffffff91505090565b919050565b610f70611edb565b67ffffffffffffffff81166110025760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161069c565b609c5467ffffffffffffffff161561109e5760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161069c565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190612508565b61117c5760405162461bcd60e51b815260040161069c9061252a565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6111c3611edb565b6111cd6000611d9f565b565b6066546000908190600190811614156112265760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161069c565b336000908152609860205260409020546001600160a01b0316156112a85760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161069c565b60006112b2611f35565b9250505090565b6066546000906001908116141561130e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161069c565b336000908152609860205260409020546001600160a01b03168061133757611334611f35565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e463490349061136d908b908b908b908b908b906004016125cf565b6000604051808303818588803b15801561138657600080fd5b505af115801561139a573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061088a57611473836001600160a01b031660001b60405180610940016040528061090e81526020016126c861090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526114589291602001612644565b6040516020818303038152906040528051906020012061209a565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114c25760405162461bcd60e51b815260040161069c906123c2565b60008112156115395760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161069c565b611547633b9aca0082612436565b156115bc576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161069c565b6001600160a01b0382166000908152609b60205260408120546115e0908390612659565b905060008112156116715760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161069c565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b03808316600090815260986020526040902054839116331461170c5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161069c565b600260c954141561175f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069c565b600260c9556001600160a01b0383166117fb5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161069c565b611809633b9aca0083612698565b156118a25760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161069c565b6001600160a01b0383166000908152609b6020526040812054906118c68483612460565b6001600160a01b0386166000908152609b602052604081208290559091506118ee8383611c66565b90508015611a565760008112156119b9576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061194d85612572565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561199c57600080fd5b505af11580156119b0573d6000803e3d6000fd5b50505050611a56565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611a3d57600080fd5b505af1158015611a51573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612fd683398151915286604051611a7f91815260200190565b60405180910390a25050600160c95550505050565b611a9c611edb565b6001600160a01b038116611b015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069c565b61094081611d9f565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906124a1565b6001600160a01b0316336001600160a01b031614611bb15760405162461bcd60e51b815260040161069c906124be565b606654198119606654191614611c2f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161069c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a77565b6000808313611c865760008213611c7f5750600061088a565b508061088a565b60008213611c9e57611c9783612572565b905061088a565b611c978383612659565b6001600160a01b038116611d365760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161069c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611e1257506001600160a01b03821615155b611e945760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161069c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611ed782611ca8565b5050565b6033546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161069c565b6000609960008154611f46906126ac565b9091555060408051610940810190915261090e808252600091611fe591839133916126c86020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611fd19291602001612644565b6040516020818303038152906040526120f6565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561202957600080fd5b505af115801561203d573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090611473565b600080844710156121495760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161069c565b82516121975760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161069c565b8383516020850187f590506001600160a01b0381166121f85760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161069c565b949350505050565b6001600160a01b038116811461094057600080fd5b6000806040838503121561222857600080fd5b823561223381612200565b946020939093013593505050565b60006020828403121561225357600080fd5b813561147381612200565b60006020828403121561227057600080fd5b5035919050565b60008060006060848603121561228c57600080fd5b833561229781612200565b925060208401356122a781612200565b929592945050506040919091013590565b6000602082840312156122ca57600080fd5b813567ffffffffffffffff8116811461147357600080fd5b6000602082840312156122f457600080fd5b813560ff8116811461147357600080fd5b60008083601f84011261231757600080fd5b50813567ffffffffffffffff81111561232f57600080fd5b60208301915083602082850101111561234757600080fd5b9250929050565b60008060008060006060868803121561236657600080fd5b853567ffffffffffffffff8082111561237e57600080fd5b61238a89838a01612305565b909750955060208801359150808211156123a357600080fd5b506123b088828901612305565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261244557612445612420565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156124825761248261244a565b600160ff1b839003841281161561249b5761249b61244a565b50500190565b6000602082840312156124b357600080fd5b815161147381612200565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561251a57600080fd5b8151801515811461147357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156125885761258861244a565b5060000390565b6000828210156125a1576125a161244a565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006125e36060830187896125a6565b82810360208401526125f68186886125a6565b9150508260408301529695505050505050565b6000815160005b8181101561262a5760208185018101518683015201612610565b81811115612639576000828601525b509290920192915050565b60006121f86126538386612609565b84612609565b60008083128015600160ff1b8501841216156126775761267761244a565b6001600160ff1b03840183138116156126925761269261244a565b50500390565b6000826126a7576126a7612420565b500790565b60006000198214156126c0576126c061244a565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220cf5293403b376506835b615be40b9da5e201d4c3a5b734ac5795ff70c85be82d64736f6c634300080c0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. @@ -233,37 +233,6 @@ func (_EigenPodManager *EigenPodManagerCallerSession) BeaconChainETHStrategy() ( return _EigenPodManager.Contract.BeaconChainETHStrategy(&_EigenPodManager.CallOpts) } -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManager *EigenPodManagerCaller) BeaconChainOracle(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _EigenPodManager.contract.Call(opts, &out, "beaconChainOracle") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManager *EigenPodManagerSession) BeaconChainOracle() (common.Address, error) { - return _EigenPodManager.Contract.BeaconChainOracle(&_EigenPodManager.CallOpts) -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManager *EigenPodManagerCallerSession) BeaconChainOracle() (common.Address, error) { - return _EigenPodManager.Contract.BeaconChainOracle(&_EigenPodManager.CallOpts) -} - // DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b. // // Solidity: function delegationManager() view returns(address) @@ -388,37 +357,6 @@ func (_EigenPodManager *EigenPodManagerCallerSession) EthPOS() (common.Address, return _EigenPodManager.Contract.EthPOS(&_EigenPodManager.CallOpts) } -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManager *EigenPodManagerCaller) GetBlockRootAtTimestamp(opts *bind.CallOpts, timestamp uint64) ([32]byte, error) { - var out []interface{} - err := _EigenPodManager.contract.Call(opts, &out, "getBlockRootAtTimestamp", timestamp) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManager *EigenPodManagerSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _EigenPodManager.Contract.GetBlockRootAtTimestamp(&_EigenPodManager.CallOpts, timestamp) -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManager *EigenPodManagerCallerSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _EigenPodManager.Contract.GetBlockRootAtTimestamp(&_EigenPodManager.CallOpts, timestamp) -} - // GetPod is a free data retrieval call binding the contract method 0xa38406a3. // // Solidity: function getPod(address podOwner) view returns(address) @@ -802,25 +740,25 @@ func (_EigenPodManager *EigenPodManagerTransactorSession) CreatePod() (*types.Tr return _EigenPodManager.Contract.CreatePod(&_EigenPodManager.TransactOpts) } -// Initialize is a paid mutator transaction binding the contract method 0xcf756fdf. +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. // -// Solidity: function initialize(address _beaconChainOracle, address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() -func (_EigenPodManager *EigenPodManagerTransactor) Initialize(opts *bind.TransactOpts, _beaconChainOracle common.Address, initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { - return _EigenPodManager.contract.Transact(opts, "initialize", _beaconChainOracle, initialOwner, _pauserRegistry, _initPausedStatus) +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_EigenPodManager *EigenPodManagerTransactor) Initialize(opts *bind.TransactOpts, initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _EigenPodManager.contract.Transact(opts, "initialize", initialOwner, _pauserRegistry, _initPausedStatus) } -// Initialize is a paid mutator transaction binding the contract method 0xcf756fdf. +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. // -// Solidity: function initialize(address _beaconChainOracle, address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() -func (_EigenPodManager *EigenPodManagerSession) Initialize(_beaconChainOracle common.Address, initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { - return _EigenPodManager.Contract.Initialize(&_EigenPodManager.TransactOpts, _beaconChainOracle, initialOwner, _pauserRegistry, _initPausedStatus) +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_EigenPodManager *EigenPodManagerSession) Initialize(initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _EigenPodManager.Contract.Initialize(&_EigenPodManager.TransactOpts, initialOwner, _pauserRegistry, _initPausedStatus) } -// Initialize is a paid mutator transaction binding the contract method 0xcf756fdf. +// Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. // -// Solidity: function initialize(address _beaconChainOracle, address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() -func (_EigenPodManager *EigenPodManagerTransactorSession) Initialize(_beaconChainOracle common.Address, initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { - return _EigenPodManager.Contract.Initialize(&_EigenPodManager.TransactOpts, _beaconChainOracle, initialOwner, _pauserRegistry, _initPausedStatus) +// Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 _initPausedStatus) returns() +func (_EigenPodManager *EigenPodManagerTransactorSession) Initialize(initialOwner common.Address, _pauserRegistry common.Address, _initPausedStatus *big.Int) (*types.Transaction, error) { + return _EigenPodManager.Contract.Initialize(&_EigenPodManager.TransactOpts, initialOwner, _pauserRegistry, _initPausedStatus) } // Pause is a paid mutator transaction binding the contract method 0x136439dd. @@ -1033,27 +971,6 @@ func (_EigenPodManager *EigenPodManagerTransactorSession) Unpause(newPausedStatu return _EigenPodManager.Contract.Unpause(&_EigenPodManager.TransactOpts, newPausedStatus) } -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManager *EigenPodManagerTransactor) UpdateBeaconChainOracle(opts *bind.TransactOpts, newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManager.contract.Transact(opts, "updateBeaconChainOracle", newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManager *EigenPodManagerSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManager.Contract.UpdateBeaconChainOracle(&_EigenPodManager.TransactOpts, newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManager *EigenPodManagerTransactorSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManager.Contract.UpdateBeaconChainOracle(&_EigenPodManager.TransactOpts, newBeaconChainOracle) -} - // WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. // // Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() diff --git a/pkg/bindings/EigenPodManagerStorage/binding.go b/pkg/bindings/EigenPodManagerStorage/binding.go index 928919851..c334500d8 100644 --- a/pkg/bindings/EigenPodManagerStorage/binding.go +++ b/pkg/bindings/EigenPodManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract. var EigenPodManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"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\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"getBlockRootAtTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateBeaconChainOracle\",\"inputs\":[{\"name\":\"newBeaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", } // EigenPodManagerStorageABI is the input ABI used to generate the binding from. @@ -211,37 +211,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) BeaconChainE return _EigenPodManagerStorage.Contract.BeaconChainETHStrategy(&_EigenPodManagerStorage.CallOpts) } -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) BeaconChainOracle(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _EigenPodManagerStorage.contract.Call(opts, &out, "beaconChainOracle") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) BeaconChainOracle() (common.Address, error) { - return _EigenPodManagerStorage.Contract.BeaconChainOracle(&_EigenPodManagerStorage.CallOpts) -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) BeaconChainOracle() (common.Address, error) { - return _EigenPodManagerStorage.Contract.BeaconChainOracle(&_EigenPodManagerStorage.CallOpts) -} - // DelegationManager is a free data retrieval call binding the contract method 0xea4d3c9b. // // Solidity: function delegationManager() view returns(address) @@ -366,37 +335,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) EthPOS() (co return _EigenPodManagerStorage.Contract.EthPOS(&_EigenPodManagerStorage.CallOpts) } -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) GetBlockRootAtTimestamp(opts *bind.CallOpts, timestamp uint64) ([32]byte, error) { - var out []interface{} - err := _EigenPodManagerStorage.contract.Call(opts, &out, "getBlockRootAtTimestamp", timestamp) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _EigenPodManagerStorage.Contract.GetBlockRootAtTimestamp(&_EigenPodManagerStorage.CallOpts, timestamp) -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _EigenPodManagerStorage.Contract.GetBlockRootAtTimestamp(&_EigenPodManagerStorage.CallOpts, timestamp) -} - // GetPod is a free data retrieval call binding the contract method 0xa38406a3. // // Solidity: function getPod(address podOwner) view returns(address) @@ -917,27 +855,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) Unpause( return _EigenPodManagerStorage.Contract.Unpause(&_EigenPodManagerStorage.TransactOpts, newPausedStatus) } -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) UpdateBeaconChainOracle(opts *bind.TransactOpts, newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManagerStorage.contract.Transact(opts, "updateBeaconChainOracle", newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.UpdateBeaconChainOracle(&_EigenPodManagerStorage.TransactOpts, newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.UpdateBeaconChainOracle(&_EigenPodManagerStorage.TransactOpts, newBeaconChainOracle) -} - // WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. // // Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go new file mode 100644 index 000000000..23954ef0d --- /dev/null +++ b/pkg/bindings/EigenPodStorage/binding.go @@ -0,0 +1,2239 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package EigenPodStorage + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceProof struct { + PubkeyHash [32]byte + BalanceRoot [32]byte + Proof []byte +} + +// BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsStateRootProof struct { + BeaconStateRoot [32]byte + Proof []byte +} + +// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsValidatorProof struct { + ValidatorFields [][32]byte + Proof []byte +} + +// IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodCheckpoint struct { + BeaconBlockRoot [32]byte + PodBalanceGwei *big.Int + BalanceDeltasGwei *big.Int + ProofsRemaining *big.Int +} + +// IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodValidatorInfo struct { + ValidatorIndex uint64 + RestakedBalanceGwei uint64 + MostRecentBalanceUpdateTimestamp uint64 + Status uint8 +} + +// EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract. +var EigenPodStorageMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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}]", +} + +// EigenPodStorageABI is the input ABI used to generate the binding from. +// Deprecated: Use EigenPodStorageMetaData.ABI instead. +var EigenPodStorageABI = EigenPodStorageMetaData.ABI + +// EigenPodStorage is an auto generated Go binding around an Ethereum contract. +type EigenPodStorage struct { + EigenPodStorageCaller // Read-only binding to the contract + EigenPodStorageTransactor // Write-only binding to the contract + EigenPodStorageFilterer // Log filterer for contract events +} + +// EigenPodStorageCaller is an auto generated read-only Go binding around an Ethereum contract. +type EigenPodStorageCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EigenPodStorageTransactor is an auto generated write-only Go binding around an Ethereum contract. +type EigenPodStorageTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EigenPodStorageFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type EigenPodStorageFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// EigenPodStorageSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type EigenPodStorageSession struct { + Contract *EigenPodStorage // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EigenPodStorageCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type EigenPodStorageCallerSession struct { + Contract *EigenPodStorageCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// EigenPodStorageTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type EigenPodStorageTransactorSession struct { + Contract *EigenPodStorageTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// EigenPodStorageRaw is an auto generated low-level Go binding around an Ethereum contract. +type EigenPodStorageRaw struct { + Contract *EigenPodStorage // Generic contract binding to access the raw methods on +} + +// EigenPodStorageCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type EigenPodStorageCallerRaw struct { + Contract *EigenPodStorageCaller // Generic read-only contract binding to access the raw methods on +} + +// EigenPodStorageTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type EigenPodStorageTransactorRaw struct { + Contract *EigenPodStorageTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewEigenPodStorage creates a new instance of EigenPodStorage, bound to a specific deployed contract. +func NewEigenPodStorage(address common.Address, backend bind.ContractBackend) (*EigenPodStorage, error) { + contract, err := bindEigenPodStorage(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EigenPodStorage{EigenPodStorageCaller: EigenPodStorageCaller{contract: contract}, EigenPodStorageTransactor: EigenPodStorageTransactor{contract: contract}, EigenPodStorageFilterer: EigenPodStorageFilterer{contract: contract}}, nil +} + +// NewEigenPodStorageCaller creates a new read-only instance of EigenPodStorage, bound to a specific deployed contract. +func NewEigenPodStorageCaller(address common.Address, caller bind.ContractCaller) (*EigenPodStorageCaller, error) { + contract, err := bindEigenPodStorage(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EigenPodStorageCaller{contract: contract}, nil +} + +// NewEigenPodStorageTransactor creates a new write-only instance of EigenPodStorage, bound to a specific deployed contract. +func NewEigenPodStorageTransactor(address common.Address, transactor bind.ContractTransactor) (*EigenPodStorageTransactor, error) { + contract, err := bindEigenPodStorage(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EigenPodStorageTransactor{contract: contract}, nil +} + +// NewEigenPodStorageFilterer creates a new log filterer instance of EigenPodStorage, bound to a specific deployed contract. +func NewEigenPodStorageFilterer(address common.Address, filterer bind.ContractFilterer) (*EigenPodStorageFilterer, error) { + contract, err := bindEigenPodStorage(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EigenPodStorageFilterer{contract: contract}, nil +} + +// bindEigenPodStorage binds a generic wrapper to an already deployed contract. +func bindEigenPodStorage(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EigenPodStorageMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EigenPodStorage *EigenPodStorageRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EigenPodStorage.Contract.EigenPodStorageCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EigenPodStorage *EigenPodStorageRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EigenPodStorage.Contract.EigenPodStorageTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EigenPodStorage *EigenPodStorageRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EigenPodStorage.Contract.EigenPodStorageTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_EigenPodStorage *EigenPodStorageCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EigenPodStorage.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_EigenPodStorage *EigenPodStorageTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EigenPodStorage.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_EigenPodStorage *EigenPodStorageTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EigenPodStorage.Contract.contract.Transact(opts, method, params...) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPodStorage *EigenPodStorageCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "activeValidatorCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPodStorage *EigenPodStorageSession) ActiveValidatorCount() (*big.Int, error) { + return _EigenPodStorage.Contract.ActiveValidatorCount(&_EigenPodStorage.CallOpts) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_EigenPodStorage *EigenPodStorageCallerSession) ActiveValidatorCount() (*big.Int, error) { + return _EigenPodStorage.Contract.ActiveValidatorCount(&_EigenPodStorage.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "currentCheckpoint") + + if err != nil { + return *new(IEigenPodCheckpoint), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodCheckpoint)).(*IEigenPodCheckpoint) + + return out0, err + +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPodStorage *EigenPodStorageSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _EigenPodStorage.Contract.CurrentCheckpoint(&_EigenPodStorage.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_EigenPodStorage *EigenPodStorageCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _EigenPodStorage.Contract.CurrentCheckpoint(&_EigenPodStorage.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "currentCheckpointTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageSession) CurrentCheckpointTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.CurrentCheckpointTimestamp(&_EigenPodStorage.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. +// +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCallerSession) CurrentCheckpointTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.CurrentCheckpointTimestamp(&_EigenPodStorage.CallOpts) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_EigenPodStorage *EigenPodStorageCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "eigenPodManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_EigenPodStorage *EigenPodStorageSession) EigenPodManager() (common.Address, error) { + return _EigenPodStorage.Contract.EigenPodManager(&_EigenPodStorage.CallOpts) +} + +// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. +// +// Solidity: function eigenPodManager() view returns(address) +func (_EigenPodStorage *EigenPodStorageCallerSession) EigenPodManager() (common.Address, error) { + return _EigenPodStorage.Contract.EigenPodManager(&_EigenPodStorage.CallOpts) +} + +// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. +// +// Solidity: function hasRestaked() view returns(bool) +func (_EigenPodStorage *EigenPodStorageCaller) HasRestaked(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "hasRestaked") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. +// +// Solidity: function hasRestaked() view returns(bool) +func (_EigenPodStorage *EigenPodStorageSession) HasRestaked() (bool, error) { + return _EigenPodStorage.Contract.HasRestaked(&_EigenPodStorage.CallOpts) +} + +// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. +// +// Solidity: function hasRestaked() view returns(bool) +func (_EigenPodStorage *EigenPodStorageCallerSession) HasRestaked() (bool, error) { + return _EigenPodStorage.Contract.HasRestaked(&_EigenPodStorage.CallOpts) +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "lastCheckpointTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageSession) LastCheckpointTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.LastCheckpointTimestamp(&_EigenPodStorage.CallOpts) +} + +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. +// +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCallerSession) LastCheckpointTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.LastCheckpointTimestamp(&_EigenPodStorage.CallOpts) +} + +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.MostRecentWithdrawalTimestamp(&_EigenPodStorage.CallOpts) +} + +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _EigenPodStorage.Contract.MostRecentWithdrawalTimestamp(&_EigenPodStorage.CallOpts) +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_EigenPodStorage *EigenPodStorageCaller) PodOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "podOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_EigenPodStorage *EigenPodStorageSession) PodOwner() (common.Address, error) { + return _EigenPodStorage.Contract.PodOwner(&_EigenPodStorage.CallOpts) +} + +// PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. +// +// Solidity: function podOwner() view returns(address) +func (_EigenPodStorage *EigenPodStorageCallerSession) PodOwner() (common.Address, error) { + return _EigenPodStorage.Contract.PodOwner(&_EigenPodStorage.CallOpts) +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageCaller) ValidatorPubkeyHashToInfo(opts *bind.CallOpts, validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "validatorPubkeyHashToInfo", validatorPubkeyHash) + + if err != nil { + return *new(IEigenPodValidatorInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodValidatorInfo)).(*IEigenPodValidatorInfo) + + return out0, err + +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageSession) ValidatorPubkeyHashToInfo(validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + return _EigenPodStorage.Contract.ValidatorPubkeyHashToInfo(&_EigenPodStorage.CallOpts, validatorPubkeyHash) +} + +// ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. +// +// Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageCallerSession) ValidatorPubkeyHashToInfo(validatorPubkeyHash [32]byte) (IEigenPodValidatorInfo, error) { + return _EigenPodStorage.Contract.ValidatorPubkeyHashToInfo(&_EigenPodStorage.CallOpts, validatorPubkeyHash) +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageCaller) ValidatorPubkeyToInfo(opts *bind.CallOpts, validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "validatorPubkeyToInfo", validatorPubkey) + + if err != nil { + return *new(IEigenPodValidatorInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodValidatorInfo)).(*IEigenPodValidatorInfo) + + return out0, err + +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageSession) ValidatorPubkeyToInfo(validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + return _EigenPodStorage.Contract.ValidatorPubkeyToInfo(&_EigenPodStorage.CallOpts, validatorPubkey) +} + +// ValidatorPubkeyToInfo is a free data retrieval call binding the contract method 0xb522538a. +// +// Solidity: function validatorPubkeyToInfo(bytes validatorPubkey) view returns((uint64,uint64,uint64,uint8)) +func (_EigenPodStorage *EigenPodStorageCallerSession) ValidatorPubkeyToInfo(validatorPubkey []byte) (IEigenPodValidatorInfo, error) { + return _EigenPodStorage.Contract.ValidatorPubkeyToInfo(&_EigenPodStorage.CallOpts, validatorPubkey) +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageCaller) ValidatorStatus(opts *bind.CallOpts, validatorPubkey []byte) (uint8, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "validatorStatus", validatorPubkey) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageSession) ValidatorStatus(validatorPubkey []byte) (uint8, error) { + return _EigenPodStorage.Contract.ValidatorStatus(&_EigenPodStorage.CallOpts, validatorPubkey) +} + +// ValidatorStatus is a free data retrieval call binding the contract method 0x58eaee79. +// +// Solidity: function validatorStatus(bytes validatorPubkey) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageCallerSession) ValidatorStatus(validatorPubkey []byte) (uint8, error) { + return _EigenPodStorage.Contract.ValidatorStatus(&_EigenPodStorage.CallOpts, validatorPubkey) +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageCaller) ValidatorStatus0(opts *bind.CallOpts, pubkeyHash [32]byte) (uint8, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "validatorStatus0", pubkeyHash) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageSession) ValidatorStatus0(pubkeyHash [32]byte) (uint8, error) { + return _EigenPodStorage.Contract.ValidatorStatus0(&_EigenPodStorage.CallOpts, pubkeyHash) +} + +// ValidatorStatus0 is a free data retrieval call binding the contract method 0x7439841f. +// +// Solidity: function validatorStatus(bytes32 pubkeyHash) view returns(uint8) +func (_EigenPodStorage *EigenPodStorageCallerSession) ValidatorStatus0(pubkeyHash [32]byte) (uint8, error) { + return _EigenPodStorage.Contract.ValidatorStatus0(&_EigenPodStorage.CallOpts, pubkeyHash) +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCaller) WithdrawableRestakedExecutionLayerGwei(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "withdrawableRestakedExecutionLayerGwei") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageSession) WithdrawableRestakedExecutionLayerGwei() (uint64, error) { + return _EigenPodStorage.Contract.WithdrawableRestakedExecutionLayerGwei(&_EigenPodStorage.CallOpts) +} + +// WithdrawableRestakedExecutionLayerGwei is a free data retrieval call binding the contract method 0x3474aa16. +// +// Solidity: function withdrawableRestakedExecutionLayerGwei() view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCallerSession) WithdrawableRestakedExecutionLayerGwei() (uint64, error) { + return _EigenPodStorage.Contract.WithdrawableRestakedExecutionLayerGwei(&_EigenPodStorage.CallOpts) +} + +// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. +// +// Solidity: function activateRestaking() returns() +func (_EigenPodStorage *EigenPodStorageTransactor) ActivateRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "activateRestaking") +} + +// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. +// +// Solidity: function activateRestaking() returns() +func (_EigenPodStorage *EigenPodStorageSession) ActivateRestaking() (*types.Transaction, error) { + return _EigenPodStorage.Contract.ActivateRestaking(&_EigenPodStorage.TransactOpts) +} + +// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. +// +// Solidity: function activateRestaking() returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) ActivateRestaking() (*types.Transaction, error) { + return _EigenPodStorage.Contract.ActivateRestaking(&_EigenPodStorage.TransactOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) Initialize(opts *bind.TransactOpts, owner common.Address) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "initialize", owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner) returns() +func (_EigenPodStorage *EigenPodStorageSession) Initialize(owner common.Address) (*types.Transaction, error) { + return _EigenPodStorage.Contract.Initialize(&_EigenPodStorage.TransactOpts, owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) Initialize(owner common.Address) (*types.Transaction, error) { + return _EigenPodStorage.Contract.Initialize(&_EigenPodStorage.TransactOpts, owner) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) RecoverTokens(opts *bind.TransactOpts, tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "recoverTokens", tokenList, amountsToWithdraw, recipient) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_EigenPodStorage *EigenPodStorageSession) RecoverTokens(tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _EigenPodStorage.Contract.RecoverTokens(&_EigenPodStorage.TransactOpts, tokenList, amountsToWithdraw, recipient) +} + +// RecoverTokens is a paid mutator transaction binding the contract method 0xdda3346c. +// +// Solidity: function recoverTokens(address[] tokenList, uint256[] amountsToWithdraw, address recipient) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) RecoverTokens(tokenList []common.Address, amountsToWithdraw []*big.Int, recipient common.Address) (*types.Transaction, error) { + return _EigenPodStorage.Contract.RecoverTokens(&_EigenPodStorage.TransactOpts, tokenList, amountsToWithdraw, recipient) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_EigenPodStorage *EigenPodStorageTransactor) Stake(opts *bind.TransactOpts, pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "stake", pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_EigenPodStorage *EigenPodStorageSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _EigenPodStorage.Contract.Stake(&_EigenPodStorage.TransactOpts, pubkey, signature, depositDataRoot) +} + +// Stake is a paid mutator transaction binding the contract method 0x9b4e4634. +// +// Solidity: function stake(bytes pubkey, bytes signature, bytes32 depositDataRoot) payable returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) Stake(pubkey []byte, signature []byte, depositDataRoot [32]byte) (*types.Transaction, error) { + return _EigenPodStorage.Contract.Stake(&_EigenPodStorage.TransactOpts, pubkey, signature, depositDataRoot) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "startCheckpoint", revertIfNoBalance) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPodStorage *EigenPodStorageSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPodStorage.Contract.StartCheckpoint(&_EigenPodStorage.TransactOpts, revertIfNoBalance) +} + +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. +// +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _EigenPodStorage.Contract.StartCheckpoint(&_EigenPodStorage.TransactOpts, revertIfNoBalance) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, stateRootProof, proofs) +} + +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. +// +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, stateRootProof, proofs) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "verifyStaleBalance", beaconTimestamp, stateRootProof, proof) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPodStorage *EigenPodStorageSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyStaleBalance(&_EigenPodStorage.TransactOpts, beaconTimestamp, stateRootProof, proof) +} + +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. +// +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyStaleBalance(&_EigenPodStorage.TransactOpts, beaconTimestamp, stateRootProof, proof) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "verifyWithdrawalCredentials", beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPodStorage *EigenPodStorageSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyWithdrawalCredentials(&_EigenPodStorage.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyWithdrawalCredentials(&_EigenPodStorage.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) WithdrawRestakedBeaconChainETH(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "withdrawRestakedBeaconChainETH", recipient, amount) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) returns() +func (_EigenPodStorage *EigenPodStorageSession) WithdrawRestakedBeaconChainETH(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _EigenPodStorage.Contract.WithdrawRestakedBeaconChainETH(&_EigenPodStorage.TransactOpts, recipient, amount) +} + +// WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. +// +// Solidity: function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) WithdrawRestakedBeaconChainETH(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _EigenPodStorage.Contract.WithdrawRestakedBeaconChainETH(&_EigenPodStorage.TransactOpts, recipient, amount) +} + +// EigenPodStorageCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the EigenPodStorage contract. +type EigenPodStorageCheckpointCreatedIterator struct { + Event *EigenPodStorageCheckpointCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageCheckpointCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageCheckpointCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageCheckpointCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageCheckpointCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageCheckpointCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageCheckpointCreated represents a CheckpointCreated event raised by the EigenPodStorage contract. +type EigenPodStorageCheckpointCreated struct { + CheckpointTimestamp uint64 + BeaconBlockRoot [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*EigenPodStorageCheckpointCreatedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) + if err != nil { + return nil, err + } + return &EigenPodStorageCheckpointCreatedIterator{contract: _EigenPodStorage.contract, event: "CheckpointCreated", logs: logs, sub: sub}, nil +} + +// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageCheckpointCreated) + if err := _EigenPodStorage.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointCreated is a log parse operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. +// +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseCheckpointCreated(log types.Log) (*EigenPodStorageCheckpointCreated, error) { + event := new(EigenPodStorageCheckpointCreated) + if err := _EigenPodStorage.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the EigenPodStorage contract. +type EigenPodStorageCheckpointFinalizedIterator struct { + Event *EigenPodStorageCheckpointFinalized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageCheckpointFinalizedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageCheckpointFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageCheckpointFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageCheckpointFinalizedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageCheckpointFinalizedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageCheckpointFinalized represents a CheckpointFinalized event raised by the EigenPodStorage contract. +type EigenPodStorageCheckpointFinalized struct { + CheckpointTimestamp uint64 + TotalShareDeltaWei *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*EigenPodStorageCheckpointFinalizedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "CheckpointFinalized", checkpointTimestampRule) + if err != nil { + return nil, err + } + return &EigenPodStorageCheckpointFinalizedIterator{contract: _EigenPodStorage.contract, event: "CheckpointFinalized", logs: logs, sub: sub}, nil +} + +// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *EigenPodStorageCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "CheckpointFinalized", checkpointTimestampRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageCheckpointFinalized) + if err := _EigenPodStorage.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. +// +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseCheckpointFinalized(log types.Log) (*EigenPodStorageCheckpointFinalized, error) { + event := new(EigenPodStorageCheckpointFinalized) + if err := _EigenPodStorage.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the EigenPodStorage contract. +type EigenPodStorageEigenPodStakedIterator struct { + Event *EigenPodStorageEigenPodStaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageEigenPodStakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageEigenPodStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageEigenPodStaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageEigenPodStakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageEigenPodStakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageEigenPodStaked represents a EigenPodStaked event raised by the EigenPodStorage contract. +type EigenPodStorageEigenPodStaked struct { + Pubkey []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*EigenPodStorageEigenPodStakedIterator, error) { + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "EigenPodStaked") + if err != nil { + return nil, err + } + return &EigenPodStorageEigenPodStakedIterator{contract: _EigenPodStorage.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil +} + +// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *EigenPodStorageEigenPodStaked) (event.Subscription, error) { + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "EigenPodStaked") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageEigenPodStaked) + if err := _EigenPodStorage.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// +// Solidity: event EigenPodStaked(bytes pubkey) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseEigenPodStaked(log types.Log) (*EigenPodStorageEigenPodStaked, error) { + event := new(EigenPodStorageEigenPodStaked) + if err := _EigenPodStorage.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the EigenPodStorage contract. +type EigenPodStorageNonBeaconChainETHReceivedIterator struct { + Event *EigenPodStorageNonBeaconChainETHReceived // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageNonBeaconChainETHReceivedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageNonBeaconChainETHReceived) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageNonBeaconChainETHReceived) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageNonBeaconChainETHReceivedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageNonBeaconChainETHReceivedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the EigenPodStorage contract. +type EigenPodStorageNonBeaconChainETHReceived struct { + AmountReceived *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*EigenPodStorageNonBeaconChainETHReceivedIterator, error) { + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "NonBeaconChainETHReceived") + if err != nil { + return nil, err + } + return &EigenPodStorageNonBeaconChainETHReceivedIterator{contract: _EigenPodStorage.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil +} + +// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *EigenPodStorageNonBeaconChainETHReceived) (event.Subscription, error) { + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "NonBeaconChainETHReceived") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageNonBeaconChainETHReceived) + if err := _EigenPodStorage.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*EigenPodStorageNonBeaconChainETHReceived, error) { + event := new(EigenPodStorageNonBeaconChainETHReceived) + if err := _EigenPodStorage.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the EigenPodStorage contract. +type EigenPodStorageRestakedBeaconChainETHWithdrawnIterator struct { + Event *EigenPodStorageRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageRestakedBeaconChainETHWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageRestakedBeaconChainETHWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageRestakedBeaconChainETHWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageRestakedBeaconChainETHWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageRestakedBeaconChainETHWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the EigenPodStorage contract. +type EigenPodStorageRestakedBeaconChainETHWithdrawn struct { + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*EigenPodStorageRestakedBeaconChainETHWithdrawnIterator, error) { + + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + if err != nil { + return nil, err + } + return &EigenPodStorageRestakedBeaconChainETHWithdrawnIterator{contract: _EigenPodStorage.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodStorageRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { + + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageRestakedBeaconChainETHWithdrawn) + if err := _EigenPodStorage.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*EigenPodStorageRestakedBeaconChainETHWithdrawn, error) { + event := new(EigenPodStorageRestakedBeaconChainETHWithdrawn) + if err := _EigenPodStorage.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the EigenPodStorage contract. +type EigenPodStorageRestakingActivatedIterator struct { + Event *EigenPodStorageRestakingActivated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageRestakingActivatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageRestakingActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageRestakingActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageRestakingActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageRestakingActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageRestakingActivated represents a RestakingActivated event raised by the EigenPodStorage contract. +type EigenPodStorageRestakingActivated struct { + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodStorageRestakingActivatedIterator, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) + if err != nil { + return nil, err + } + return &EigenPodStorageRestakingActivatedIterator{contract: _EigenPodStorage.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil +} + +// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageRestakingActivated, podOwner []common.Address) (event.Subscription, error) { + + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageRestakingActivated) + if err := _EigenPodStorage.contract.UnpackLog(event, "RestakingActivated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// +// Solidity: event RestakingActivated(address indexed podOwner) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseRestakingActivated(log types.Log) (*EigenPodStorageRestakingActivated, error) { + event := new(EigenPodStorageRestakingActivated) + if err := _EigenPodStorage.contract.UnpackLog(event, "RestakingActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPodStorage contract. +type EigenPodStorageValidatorBalanceUpdatedIterator struct { + Event *EigenPodStorageValidatorBalanceUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageValidatorBalanceUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorBalanceUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorBalanceUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageValidatorBalanceUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageValidatorBalanceUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the EigenPodStorage contract. +type EigenPodStorageValidatorBalanceUpdated struct { + ValidatorIndex *big.Int + BalanceTimestamp uint64 + NewValidatorBalanceGwei uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*EigenPodStorageValidatorBalanceUpdatedIterator, error) { + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "ValidatorBalanceUpdated") + if err != nil { + return nil, err + } + return &EigenPodStorageValidatorBalanceUpdatedIterator{contract: _EigenPodStorage.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil +} + +// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorBalanceUpdated) (event.Subscription, error) { + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "ValidatorBalanceUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageValidatorBalanceUpdated) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorBalanceUpdated(log types.Log) (*EigenPodStorageValidatorBalanceUpdated, error) { + event := new(EigenPodStorageValidatorBalanceUpdated) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the EigenPodStorage contract. +type EigenPodStorageValidatorCheckpointedIterator struct { + Event *EigenPodStorageValidatorCheckpointed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageValidatorCheckpointedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorCheckpointed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorCheckpointed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageValidatorCheckpointedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageValidatorCheckpointedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageValidatorCheckpointed represents a ValidatorCheckpointed event raised by the EigenPodStorage contract. +type EigenPodStorageValidatorCheckpointed struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*EigenPodStorageValidatorCheckpointedIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &EigenPodStorageValidatorCheckpointedIterator{contract: _EigenPodStorage.contract, event: "ValidatorCheckpointed", logs: logs, sub: sub}, nil +} + +// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorCheckpointed, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageValidatorCheckpointed) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. +// +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorCheckpointed(log types.Log) (*EigenPodStorageValidatorCheckpointed, error) { + event := new(EigenPodStorageValidatorCheckpointed) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageValidatorRestakedIterator is returned from FilterValidatorRestaked and is used to iterate over the raw logs and unpacked data for ValidatorRestaked events raised by the EigenPodStorage contract. +type EigenPodStorageValidatorRestakedIterator struct { + Event *EigenPodStorageValidatorRestaked // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageValidatorRestakedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorRestaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorRestaked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageValidatorRestakedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageValidatorRestakedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageValidatorRestaked represents a ValidatorRestaked event raised by the EigenPodStorage contract. +type EigenPodStorageValidatorRestaked struct { + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRestaked is a free log retrieval operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorRestaked(opts *bind.FilterOpts) (*EigenPodStorageValidatorRestakedIterator, error) { + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "ValidatorRestaked") + if err != nil { + return nil, err + } + return &EigenPodStorageValidatorRestakedIterator{contract: _EigenPodStorage.contract, event: "ValidatorRestaked", logs: logs, sub: sub}, nil +} + +// WatchValidatorRestaked is a free log subscription operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorRestaked(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorRestaked) (event.Subscription, error) { + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "ValidatorRestaked") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageValidatorRestaked) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorRestaked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRestaked is a log parse operation binding the contract event 0x2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449. +// +// Solidity: event ValidatorRestaked(uint40 validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorRestaked(log types.Log) (*EigenPodStorageValidatorRestaked, error) { + event := new(EigenPodStorageValidatorRestaked) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorRestaked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// EigenPodStorageValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the EigenPodStorage contract. +type EigenPodStorageValidatorWithdrawnIterator struct { + Event *EigenPodStorageValidatorWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *EigenPodStorageValidatorWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(EigenPodStorageValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *EigenPodStorageValidatorWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *EigenPodStorageValidatorWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// EigenPodStorageValidatorWithdrawn represents a ValidatorWithdrawn event raised by the EigenPodStorage contract. +type EigenPodStorageValidatorWithdrawn struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*EigenPodStorageValidatorWithdrawnIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &EigenPodStorageValidatorWithdrawnIterator{contract: _EigenPodStorage.contract, event: "ValidatorWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *EigenPodStorageValidatorWithdrawn, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(EigenPodStorageValidatorWithdrawn) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_EigenPodStorage *EigenPodStorageFilterer) ParseValidatorWithdrawn(log types.Log) (*EigenPodStorageValidatorWithdrawn, error) { + event := new(EigenPodStorageValidatorWithdrawn) + if err := _EigenPodStorage.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 9c3df68ad..f113b5885 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220914de3889c5a67fd536c245b24d5dcb3ec6da3dd273b34cfa3f129928801ac5964736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220dbf9d2acf081cb52d4e46dbae1d726b585fac1ca6cac3f6af9b067c1f3d0b5d364736f6c634300080c0033", } // 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 971d34dd7..5df4410cc 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: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209aaa7fc8edeceb818497dc77ef1ff3830403a669bcd0014f8af1e039bd09c23b64736f6c634300080c0033", + Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204bf8cc3d692dc481489653314be9fb428918be6dc1f55e4efad2a15253360a3c64736f6c634300080c0033", } // EndianABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go index d99c5eae3..e4c5eb03c 100644 --- a/pkg/bindings/IEigenPod/binding.go +++ b/pkg/bindings/IEigenPod/binding.go @@ -29,26 +29,31 @@ var ( _ = abi.ConvertType ) +// BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceProof struct { + PubkeyHash [32]byte + BalanceRoot [32]byte + Proof []byte +} + // BeaconChainProofsStateRootProof is an auto generated low-level Go binding around an user-defined struct. type BeaconChainProofsStateRootProof struct { BeaconStateRoot [32]byte Proof []byte } -// BeaconChainProofsWithdrawalProof is an auto generated low-level Go binding around an user-defined struct. -type BeaconChainProofsWithdrawalProof struct { - WithdrawalProof []byte - SlotProof []byte - ExecutionPayloadProof []byte - TimestampProof []byte - HistoricalSummaryBlockRootProof []byte - BlockRootIndex uint64 - HistoricalSummaryIndex uint64 - WithdrawalIndex uint64 - BlockRoot [32]byte - SlotRoot [32]byte - TimestampRoot [32]byte - ExecutionPayloadRoot [32]byte +// BeaconChainProofsValidatorProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsValidatorProof struct { + ValidatorFields [][32]byte + Proof []byte +} + +// IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. +type IEigenPodCheckpoint struct { + BeaconBlockRoot [32]byte + PodBalanceGwei *big.Int + BalanceDeltasGwei *big.Int + ProofsRemaining *big.Int } // IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. @@ -61,7 +66,7 @@ type IEigenPodValidatorInfo struct { // IEigenPodMetaData contains all meta data concerning the IEigenPod contract. var IEigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonBeaconChainETHBalanceWei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provenWithdrawal\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slot\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyAndProcessWithdrawals\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"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\":\"withdrawalProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.WithdrawalProof[]\",\"components\":[{\"name\":\"withdrawalProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"slotProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executionPayloadProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timestampProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"historicalSummaryBlockRootProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blockRootIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"historicalSummaryIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"withdrawalIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestampRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executionPayloadRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"},{\"name\":\"withdrawalFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyBalanceUpdates\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"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\":\"withdrawalCredentialProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBeforeRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawNonBeaconChainETHBalanceWei\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountToWithdraw\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FullWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PartialWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"partialWithdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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}]", } // IEigenPodABI is the input ABI used to generate the binding from. @@ -210,12 +215,74 @@ func (_IEigenPod *IEigenPodTransactorRaw) Transact(opts *bind.TransactOpts, meth return _IEigenPod.Contract.contract.Transact(opts, method, params...) } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_IEigenPod *IEigenPodCaller) ActiveValidatorCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IEigenPod.contract.Call(opts, &out, "activeValidatorCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_IEigenPod *IEigenPodSession) ActiveValidatorCount() (*big.Int, error) { + return _IEigenPod.Contract.ActiveValidatorCount(&_IEigenPod.CallOpts) +} + +// ActiveValidatorCount is a free data retrieval call binding the contract method 0x2340e8d3. +// +// Solidity: function activeValidatorCount() view returns(uint256) +func (_IEigenPod *IEigenPodCallerSession) ActiveValidatorCount() (*big.Int, error) { + return _IEigenPod.Contract.ActiveValidatorCount(&_IEigenPod.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_IEigenPod *IEigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { + var out []interface{} + err := _IEigenPod.contract.Call(opts, &out, "currentCheckpoint") + + if err != nil { + return *new(IEigenPodCheckpoint), err + } + + out0 := *abi.ConvertType(out[0], new(IEigenPodCheckpoint)).(*IEigenPodCheckpoint) + + return out0, err + +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_IEigenPod *IEigenPodSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _IEigenPod.Contract.CurrentCheckpoint(&_IEigenPod.CallOpts) +} + +// CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. +// +// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +func (_IEigenPod *IEigenPodCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { + return _IEigenPod.Contract.CurrentCheckpoint(&_IEigenPod.CallOpts) +} + +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_IEigenPod *IEigenPodCaller) MAXRESTAKEDBALANCEGWEIPERVALIDATOR(opts *bind.CallOpts) (uint64, error) { +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCaller) CurrentCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR") + err := _IEigenPod.contract.Call(opts, &out, "currentCheckpointTimestamp") if err != nil { return *new(uint64), err @@ -227,18 +294,18 @@ func (_IEigenPod *IEigenPodCaller) MAXRESTAKEDBALANCEGWEIPERVALIDATOR(opts *bind } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_IEigenPod *IEigenPodSession) MAXRESTAKEDBALANCEGWEIPERVALIDATOR() (uint64, error) { - return _IEigenPod.Contract.MAXRESTAKEDBALANCEGWEIPERVALIDATOR(&_IEigenPod.CallOpts) +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodSession) CurrentCheckpointTimestamp() (uint64, error) { + return _IEigenPod.Contract.CurrentCheckpointTimestamp(&_IEigenPod.CallOpts) } -// MAXRESTAKEDBALANCEGWEIPERVALIDATOR is a free data retrieval call binding the contract method 0x1d905d5c. +// CurrentCheckpointTimestamp is a free data retrieval call binding the contract method 0x42ecff2a. // -// Solidity: function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() view returns(uint64) -func (_IEigenPod *IEigenPodCallerSession) MAXRESTAKEDBALANCEGWEIPERVALIDATOR() (uint64, error) { - return _IEigenPod.Contract.MAXRESTAKEDBALANCEGWEIPERVALIDATOR(&_IEigenPod.CallOpts) +// Solidity: function currentCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCallerSession) CurrentCheckpointTimestamp() (uint64, error) { + return _IEigenPod.Contract.CurrentCheckpointTimestamp(&_IEigenPod.CallOpts) } // EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. @@ -303,12 +370,12 @@ func (_IEigenPod *IEigenPodCallerSession) HasRestaked() (bool, error) { return _IEigenPod.Contract.HasRestaked(&_IEigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCaller) LastCheckpointTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") + err := _IEigenPod.contract.Call(opts, &out, "lastCheckpointTimestamp") if err != nil { return *new(uint64), err @@ -320,49 +387,49 @@ func (_IEigenPod *IEigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.Call } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodSession) LastCheckpointTimestamp() (uint64, error) { + return _IEigenPod.Contract.LastCheckpointTimestamp(&_IEigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. +// LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) +// Solidity: function lastCheckpointTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCallerSession) LastCheckpointTimestamp() (uint64, error) { + return _IEigenPod.Contract.LastCheckpointTimestamp(&_IEigenPod.CallOpts) } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_IEigenPod *IEigenPodCaller) NonBeaconChainETHBalanceWei(opts *bind.CallOpts) (*big.Int, error) { +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "nonBeaconChainETHBalanceWei") + err := _IEigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") if err != nil { - return *new(*big.Int), err + return *new(uint64), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) return out0, err } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_IEigenPod *IEigenPodSession) NonBeaconChainETHBalanceWei() (*big.Int, error) { - return _IEigenPod.Contract.NonBeaconChainETHBalanceWei(&_IEigenPod.CallOpts) +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) } -// NonBeaconChainETHBalanceWei is a free data retrieval call binding the contract method 0xfe80b087. +// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. // -// Solidity: function nonBeaconChainETHBalanceWei() view returns(uint256) -func (_IEigenPod *IEigenPodCallerSession) NonBeaconChainETHBalanceWei() (*big.Int, error) { - return _IEigenPod.Contract.NonBeaconChainETHBalanceWei(&_IEigenPod.CallOpts) +// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) +func (_IEigenPod *IEigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { + return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) } // PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. @@ -396,37 +463,6 @@ func (_IEigenPod *IEigenPodCallerSession) PodOwner() (common.Address, error) { return _IEigenPod.Contract.PodOwner(&_IEigenPod.CallOpts) } -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) view returns(bool) -func (_IEigenPod *IEigenPodCaller) ProvenWithdrawal(opts *bind.CallOpts, validatorPubkeyHash [32]byte, slot uint64) (bool, error) { - var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "provenWithdrawal", validatorPubkeyHash, slot) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) view returns(bool) -func (_IEigenPod *IEigenPodSession) ProvenWithdrawal(validatorPubkeyHash [32]byte, slot uint64) (bool, error) { - return _IEigenPod.Contract.ProvenWithdrawal(&_IEigenPod.CallOpts, validatorPubkeyHash, slot) -} - -// ProvenWithdrawal is a free data retrieval call binding the contract method 0x34bea20a. -// -// Solidity: function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) view returns(bool) -func (_IEigenPod *IEigenPodCallerSession) ProvenWithdrawal(validatorPubkeyHash [32]byte, slot uint64) (bool, error) { - return _IEigenPod.Contract.ProvenWithdrawal(&_IEigenPod.CallOpts, validatorPubkeyHash, slot) -} - // ValidatorPubkeyHashToInfo is a free data retrieval call binding the contract method 0x6fcd0e53. // // Solidity: function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) view returns((uint64,uint64,uint64,uint8)) @@ -666,109 +702,88 @@ func (_IEigenPod *IEigenPodTransactorSession) Stake(pubkey []byte, signature []b return _IEigenPod.Contract.Stake(&_IEigenPod.TransactOpts, pubkey, signature, depositDataRoot) } -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_IEigenPod *IEigenPodTransactor) VerifyAndProcessWithdrawals(opts *bind.TransactOpts, oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "verifyAndProcessWithdrawals", oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_IEigenPod *IEigenPodSession) VerifyAndProcessWithdrawals(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyAndProcessWithdrawals(&_IEigenPod.TransactOpts, oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyAndProcessWithdrawals is a paid mutator transaction binding the contract method 0xe251ef52. -// -// Solidity: function verifyAndProcessWithdrawals(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, (bytes,bytes,bytes,bytes,bytes,uint64,uint64,uint64,bytes32,bytes32,bytes32,bytes32)[] withdrawalProofs, bytes[] validatorFieldsProofs, bytes32[][] validatorFields, bytes32[][] withdrawalFields) returns() -func (_IEigenPod *IEigenPodTransactorSession) VerifyAndProcessWithdrawals(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, withdrawalProofs []BeaconChainProofsWithdrawalProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte, withdrawalFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyAndProcessWithdrawals(&_IEigenPod.TransactOpts, oracleTimestamp, stateRootProof, withdrawalProofs, validatorFieldsProofs, validatorFields, withdrawalFields) -} - -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodTransactor) VerifyBalanceUpdates(opts *bind.TransactOpts, oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "verifyBalanceUpdates", oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_IEigenPod *IEigenPodTransactor) StartCheckpoint(opts *bind.TransactOpts, revertIfNoBalance bool) (*types.Transaction, error) { + return _IEigenPod.contract.Transact(opts, "startCheckpoint", revertIfNoBalance) } -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodSession) VerifyBalanceUpdates(oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyBalanceUpdates(&_IEigenPod.TransactOpts, oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_IEigenPod *IEigenPodSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _IEigenPod.Contract.StartCheckpoint(&_IEigenPod.TransactOpts, revertIfNoBalance) } -// VerifyBalanceUpdates is a paid mutator transaction binding the contract method 0xa50600f4. +// StartCheckpoint is a paid mutator transaction binding the contract method 0x88676cad. // -// Solidity: function verifyBalanceUpdates(uint64 oracleTimestamp, uint40[] validatorIndices, (bytes32,bytes) stateRootProof, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodTransactorSession) VerifyBalanceUpdates(oracleTimestamp uint64, validatorIndices []*big.Int, stateRootProof BeaconChainProofsStateRootProof, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyBalanceUpdates(&_IEigenPod.TransactOpts, oracleTimestamp, validatorIndices, stateRootProof, validatorFieldsProofs, validatorFields) +// Solidity: function startCheckpoint(bool revertIfNoBalance) returns() +func (_IEigenPod *IEigenPodTransactorSession) StartCheckpoint(revertIfNoBalance bool) (*types.Transaction, error) { + return _IEigenPod.Contract.StartCheckpoint(&_IEigenPod.TransactOpts, revertIfNoBalance) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] withdrawalCredentialProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, withdrawalCredentialProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "verifyWithdrawalCredentials", oracleTimestamp, stateRootProof, validatorIndices, withdrawalCredentialProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] withdrawalCredentialProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodSession) VerifyWithdrawalCredentials(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, withdrawalCredentialProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyWithdrawalCredentials(&_IEigenPod.TransactOpts, oracleTimestamp, stateRootProof, validatorIndices, withdrawalCredentialProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, stateRootProof, proofs) } -// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. +// VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyWithdrawalCredentials(uint64 oracleTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] withdrawalCredentialProofs, bytes32[][] validatorFields) returns() -func (_IEigenPod *IEigenPodTransactorSession) VerifyWithdrawalCredentials(oracleTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, withdrawalCredentialProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyWithdrawalCredentials(&_IEigenPod.TransactOpts, oracleTimestamp, stateRootProof, validatorIndices, withdrawalCredentialProofs, validatorFields) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, stateRootProof, proofs) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_IEigenPod *IEigenPodTransactor) WithdrawBeforeRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "withdrawBeforeRestaking") +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_IEigenPod *IEigenPodTransactor) VerifyStaleBalance(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _IEigenPod.contract.Transact(opts, "verifyStaleBalance", beaconTimestamp, stateRootProof, proof) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_IEigenPod *IEigenPodSession) WithdrawBeforeRestaking() (*types.Transaction, error) { - return _IEigenPod.Contract.WithdrawBeforeRestaking(&_IEigenPod.TransactOpts) +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_IEigenPod *IEigenPodSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyStaleBalance(&_IEigenPod.TransactOpts, beaconTimestamp, stateRootProof, proof) } -// WithdrawBeforeRestaking is a paid mutator transaction binding the contract method 0xbaa7145a. +// VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. // -// Solidity: function withdrawBeforeRestaking() returns() -func (_IEigenPod *IEigenPodTransactorSession) WithdrawBeforeRestaking() (*types.Transaction, error) { - return _IEigenPod.Contract.WithdrawBeforeRestaking(&_IEigenPod.TransactOpts) +// Solidity: function verifyStaleBalance(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, (bytes32[],bytes) proof) returns() +func (_IEigenPod *IEigenPodTransactorSession) VerifyStaleBalance(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, proof BeaconChainProofsValidatorProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyStaleBalance(&_IEigenPod.TransactOpts, beaconTimestamp, stateRootProof, proof) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_IEigenPod *IEigenPodTransactor) WithdrawNonBeaconChainETHBalanceWei(opts *bind.TransactOpts, recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "withdrawNonBeaconChainETHBalanceWei", recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_IEigenPod *IEigenPodTransactor) VerifyWithdrawalCredentials(opts *bind.TransactOpts, beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _IEigenPod.contract.Transact(opts, "verifyWithdrawalCredentials", beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_IEigenPod *IEigenPodSession) WithdrawNonBeaconChainETHBalanceWei(recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _IEigenPod.Contract.WithdrawNonBeaconChainETHBalanceWei(&_IEigenPod.TransactOpts, recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_IEigenPod *IEigenPodSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyWithdrawalCredentials(&_IEigenPod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } -// WithdrawNonBeaconChainETHBalanceWei is a paid mutator transaction binding the contract method 0xe2c83445. +// VerifyWithdrawalCredentials is a paid mutator transaction binding the contract method 0x3f65cf19. // -// Solidity: function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) returns() -func (_IEigenPod *IEigenPodTransactorSession) WithdrawNonBeaconChainETHBalanceWei(recipient common.Address, amountToWithdraw *big.Int) (*types.Transaction, error) { - return _IEigenPod.Contract.WithdrawNonBeaconChainETHBalanceWei(&_IEigenPod.TransactOpts, recipient, amountToWithdraw) +// Solidity: function verifyWithdrawalCredentials(uint64 beaconTimestamp, (bytes32,bytes) stateRootProof, uint40[] validatorIndices, bytes[] validatorFieldsProofs, bytes32[][] validatorFields) returns() +func (_IEigenPod *IEigenPodTransactorSession) VerifyWithdrawalCredentials(beaconTimestamp uint64, stateRootProof BeaconChainProofsStateRootProof, validatorIndices []*big.Int, validatorFieldsProofs [][]byte, validatorFields [][][32]byte) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyWithdrawalCredentials(&_IEigenPod.TransactOpts, beaconTimestamp, stateRootProof, validatorIndices, validatorFieldsProofs, validatorFields) } // WithdrawRestakedBeaconChainETH is a paid mutator transaction binding the contract method 0xc4907442. @@ -792,9 +807,9 @@ func (_IEigenPod *IEigenPodTransactorSession) WithdrawRestakedBeaconChainETH(rec return _IEigenPod.Contract.WithdrawRestakedBeaconChainETH(&_IEigenPod.TransactOpts, recipient, amount) } -// IEigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the IEigenPod contract. -type IEigenPodEigenPodStakedIterator struct { - Event *IEigenPodEigenPodStaked // Event containing the contract specifics and raw log +// IEigenPodCheckpointCreatedIterator is returned from FilterCheckpointCreated and is used to iterate over the raw logs and unpacked data for CheckpointCreated events raised by the IEigenPod contract. +type IEigenPodCheckpointCreatedIterator struct { + Event *IEigenPodCheckpointCreated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -808,7 +823,7 @@ type IEigenPodEigenPodStakedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodEigenPodStakedIterator) Next() bool { +func (it *IEigenPodCheckpointCreatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -817,7 +832,7 @@ func (it *IEigenPodEigenPodStakedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodEigenPodStaked) + it.Event = new(IEigenPodCheckpointCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -832,7 +847,7 @@ func (it *IEigenPodEigenPodStakedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodEigenPodStaked) + it.Event = new(IEigenPodCheckpointCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -848,41 +863,60 @@ func (it *IEigenPodEigenPodStakedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodEigenPodStakedIterator) Error() error { +func (it *IEigenPodCheckpointCreatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodEigenPodStakedIterator) Close() error { +func (it *IEigenPodCheckpointCreatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodEigenPodStaked represents a EigenPodStaked event raised by the IEigenPod contract. -type IEigenPodEigenPodStaked struct { - Pubkey []byte - Raw types.Log // Blockchain specific contextual infos +// IEigenPodCheckpointCreated represents a CheckpointCreated event raised by the IEigenPod contract. +type IEigenPodCheckpointCreated struct { + CheckpointTimestamp uint64 + BeaconBlockRoot [32]byte + Raw types.Log // Blockchain specific contextual infos } -// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// FilterCheckpointCreated is a free log retrieval operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_IEigenPod *IEigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*IEigenPodEigenPodStakedIterator, error) { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_IEigenPod *IEigenPodFilterer) FilterCheckpointCreated(opts *bind.FilterOpts, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (*IEigenPodCheckpointCreatedIterator, error) { - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "EigenPodStaked") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) if err != nil { return nil, err } - return &IEigenPodEigenPodStakedIterator{contract: _IEigenPod.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil + return &IEigenPodCheckpointCreatedIterator{contract: _IEigenPod.contract, event: "CheckpointCreated", logs: logs, sub: sub}, nil } -// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// WatchCheckpointCreated is a free log subscription operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_IEigenPod *IEigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *IEigenPodEigenPodStaked) (event.Subscription, error) { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_IEigenPod *IEigenPodFilterer) WatchCheckpointCreated(opts *bind.WatchOpts, sink chan<- *IEigenPodCheckpointCreated, checkpointTimestamp []uint64, beaconBlockRoot [][32]byte) (event.Subscription, error) { - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "EigenPodStaked") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var beaconBlockRootRule []interface{} + for _, beaconBlockRootItem := range beaconBlockRoot { + beaconBlockRootRule = append(beaconBlockRootRule, beaconBlockRootItem) + } + + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "CheckpointCreated", checkpointTimestampRule, beaconBlockRootRule) if err != nil { return nil, err } @@ -892,8 +926,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, s select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodEigenPodStaked) - if err := _IEigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { + event := new(IEigenPodCheckpointCreated) + if err := _IEigenPod.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { return err } event.Raw = log @@ -914,21 +948,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, s }), nil } -// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. +// ParseCheckpointCreated is a log parse operation binding the contract event 0x17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf6. // -// Solidity: event EigenPodStaked(bytes pubkey) -func (_IEigenPod *IEigenPodFilterer) ParseEigenPodStaked(log types.Log) (*IEigenPodEigenPodStaked, error) { - event := new(IEigenPodEigenPodStaked) - if err := _IEigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { +// Solidity: event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot) +func (_IEigenPod *IEigenPodFilterer) ParseCheckpointCreated(log types.Log) (*IEigenPodCheckpointCreated, error) { + event := new(IEigenPodCheckpointCreated) + if err := _IEigenPod.contract.UnpackLog(event, "CheckpointCreated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodFullWithdrawalRedeemedIterator is returned from FilterFullWithdrawalRedeemed and is used to iterate over the raw logs and unpacked data for FullWithdrawalRedeemed events raised by the IEigenPod contract. -type IEigenPodFullWithdrawalRedeemedIterator struct { - Event *IEigenPodFullWithdrawalRedeemed // Event containing the contract specifics and raw log +// IEigenPodCheckpointFinalizedIterator is returned from FilterCheckpointFinalized and is used to iterate over the raw logs and unpacked data for CheckpointFinalized events raised by the IEigenPod contract. +type IEigenPodCheckpointFinalizedIterator struct { + Event *IEigenPodCheckpointFinalized // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -942,7 +976,7 @@ type IEigenPodFullWithdrawalRedeemedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodFullWithdrawalRedeemedIterator) Next() bool { +func (it *IEigenPodCheckpointFinalizedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -951,7 +985,7 @@ func (it *IEigenPodFullWithdrawalRedeemedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodFullWithdrawalRedeemed) + it.Event = new(IEigenPodCheckpointFinalized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -966,7 +1000,7 @@ func (it *IEigenPodFullWithdrawalRedeemedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodFullWithdrawalRedeemed) + it.Event = new(IEigenPodCheckpointFinalized) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -982,54 +1016,52 @@ func (it *IEigenPodFullWithdrawalRedeemedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodFullWithdrawalRedeemedIterator) Error() error { +func (it *IEigenPodCheckpointFinalizedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodFullWithdrawalRedeemedIterator) Close() error { +func (it *IEigenPodCheckpointFinalizedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodFullWithdrawalRedeemed represents a FullWithdrawalRedeemed event raised by the IEigenPod contract. -type IEigenPodFullWithdrawalRedeemed struct { - ValidatorIndex *big.Int - WithdrawalTimestamp uint64 - Recipient common.Address - WithdrawalAmountGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// IEigenPodCheckpointFinalized represents a CheckpointFinalized event raised by the IEigenPod contract. +type IEigenPodCheckpointFinalized struct { + CheckpointTimestamp uint64 + TotalShareDeltaWei *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterFullWithdrawalRedeemed is a free log retrieval operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// FilterCheckpointFinalized is a free log retrieval operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) FilterFullWithdrawalRedeemed(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodFullWithdrawalRedeemedIterator, error) { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_IEigenPod *IEigenPodFilterer) FilterCheckpointFinalized(opts *bind.FilterOpts, checkpointTimestamp []uint64) (*IEigenPodCheckpointFinalizedIterator, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) } - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "FullWithdrawalRedeemed", recipientRule) + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "CheckpointFinalized", checkpointTimestampRule) if err != nil { return nil, err } - return &IEigenPodFullWithdrawalRedeemedIterator{contract: _IEigenPod.contract, event: "FullWithdrawalRedeemed", logs: logs, sub: sub}, nil + return &IEigenPodCheckpointFinalizedIterator{contract: _IEigenPod.contract, event: "CheckpointFinalized", logs: logs, sub: sub}, nil } -// WatchFullWithdrawalRedeemed is a free log subscription operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// WatchCheckpointFinalized is a free log subscription operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.WatchOpts, sink chan<- *IEigenPodFullWithdrawalRedeemed, recipient []common.Address) (event.Subscription, error) { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_IEigenPod *IEigenPodFilterer) WatchCheckpointFinalized(opts *bind.WatchOpts, sink chan<- *IEigenPodCheckpointFinalized, checkpointTimestamp []uint64) (event.Subscription, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) } - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "FullWithdrawalRedeemed", recipientRule) + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "CheckpointFinalized", checkpointTimestampRule) if err != nil { return nil, err } @@ -1039,8 +1071,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.Watc select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodFullWithdrawalRedeemed) - if err := _IEigenPod.contract.UnpackLog(event, "FullWithdrawalRedeemed", log); err != nil { + event := new(IEigenPodCheckpointFinalized) + if err := _IEigenPod.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { return err } event.Raw = log @@ -1061,21 +1093,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchFullWithdrawalRedeemed(opts *bind.Watc }), nil } -// ParseFullWithdrawalRedeemed is a log parse operation binding the contract event 0xb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a0963. +// ParseCheckpointFinalized is a log parse operation binding the contract event 0x525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44. // -// Solidity: event FullWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 withdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) ParseFullWithdrawalRedeemed(log types.Log) (*IEigenPodFullWithdrawalRedeemed, error) { - event := new(IEigenPodFullWithdrawalRedeemed) - if err := _IEigenPod.contract.UnpackLog(event, "FullWithdrawalRedeemed", log); err != nil { +// Solidity: event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei) +func (_IEigenPod *IEigenPodFilterer) ParseCheckpointFinalized(log types.Log) (*IEigenPodCheckpointFinalized, error) { + event := new(IEigenPodCheckpointFinalized) + if err := _IEigenPod.contract.UnpackLog(event, "CheckpointFinalized", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the IEigenPod contract. -type IEigenPodNonBeaconChainETHReceivedIterator struct { - Event *IEigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log +// IEigenPodEigenPodStakedIterator is returned from FilterEigenPodStaked and is used to iterate over the raw logs and unpacked data for EigenPodStaked events raised by the IEigenPod contract. +type IEigenPodEigenPodStakedIterator struct { + Event *IEigenPodEigenPodStaked // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1089,7 +1121,7 @@ type IEigenPodNonBeaconChainETHReceivedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodNonBeaconChainETHReceivedIterator) Next() bool { +func (it *IEigenPodEigenPodStakedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1098,7 +1130,7 @@ func (it *IEigenPodNonBeaconChainETHReceivedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodNonBeaconChainETHReceived) + it.Event = new(IEigenPodEigenPodStaked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1113,7 +1145,7 @@ func (it *IEigenPodNonBeaconChainETHReceivedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodNonBeaconChainETHReceived) + it.Event = new(IEigenPodEigenPodStaked) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1129,41 +1161,41 @@ func (it *IEigenPodNonBeaconChainETHReceivedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodNonBeaconChainETHReceivedIterator) Error() error { +func (it *IEigenPodEigenPodStakedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodNonBeaconChainETHReceivedIterator) Close() error { +func (it *IEigenPodEigenPodStakedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the IEigenPod contract. -type IEigenPodNonBeaconChainETHReceived struct { - AmountReceived *big.Int - Raw types.Log // Blockchain specific contextual infos +// IEigenPodEigenPodStaked represents a EigenPodStaked event raised by the IEigenPod contract. +type IEigenPodEigenPodStaked struct { + Pubkey []byte + Raw types.Log // Blockchain specific contextual infos } -// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// FilterEigenPodStaked is a free log retrieval operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_IEigenPod *IEigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*IEigenPodNonBeaconChainETHReceivedIterator, error) { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_IEigenPod *IEigenPodFilterer) FilterEigenPodStaked(opts *bind.FilterOpts) (*IEigenPodEigenPodStakedIterator, error) { - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "NonBeaconChainETHReceived") + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "EigenPodStaked") if err != nil { return nil, err } - return &IEigenPodNonBeaconChainETHReceivedIterator{contract: _IEigenPod.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil + return &IEigenPodEigenPodStakedIterator{contract: _IEigenPod.contract, event: "EigenPodStaked", logs: logs, sub: sub}, nil } -// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// WatchEigenPodStaked is a free log subscription operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *IEigenPodNonBeaconChainETHReceived) (event.Subscription, error) { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_IEigenPod *IEigenPodFilterer) WatchEigenPodStaked(opts *bind.WatchOpts, sink chan<- *IEigenPodEigenPodStaked) (event.Subscription, error) { - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "NonBeaconChainETHReceived") + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "EigenPodStaked") if err != nil { return nil, err } @@ -1173,8 +1205,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodNonBeaconChainETHReceived) - if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { + event := new(IEigenPodEigenPodStaked) + if err := _IEigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { return err } event.Raw = log @@ -1195,21 +1227,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.W }), nil } -// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. +// ParseEigenPodStaked is a log parse operation binding the contract event 0x606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23. // -// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) -func (_IEigenPod *IEigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*IEigenPodNonBeaconChainETHReceived, error) { - event := new(IEigenPodNonBeaconChainETHReceived) - if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { +// Solidity: event EigenPodStaked(bytes pubkey) +func (_IEigenPod *IEigenPodFilterer) ParseEigenPodStaked(log types.Log) (*IEigenPodEigenPodStaked, error) { + event := new(IEigenPodEigenPodStaked) + if err := _IEigenPod.contract.UnpackLog(event, "EigenPodStaked", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodNonBeaconChainETHWithdrawnIterator is returned from FilterNonBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHWithdrawn events raised by the IEigenPod contract. -type IEigenPodNonBeaconChainETHWithdrawnIterator struct { - Event *IEigenPodNonBeaconChainETHWithdrawn // Event containing the contract specifics and raw log +// IEigenPodNonBeaconChainETHReceivedIterator is returned from FilterNonBeaconChainETHReceived and is used to iterate over the raw logs and unpacked data for NonBeaconChainETHReceived events raised by the IEigenPod contract. +type IEigenPodNonBeaconChainETHReceivedIterator struct { + Event *IEigenPodNonBeaconChainETHReceived // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1223,7 +1255,7 @@ type IEigenPodNonBeaconChainETHWithdrawnIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { +func (it *IEigenPodNonBeaconChainETHReceivedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1232,7 +1264,7 @@ func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodNonBeaconChainETHWithdrawn) + it.Event = new(IEigenPodNonBeaconChainETHReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1247,7 +1279,7 @@ func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodNonBeaconChainETHWithdrawn) + it.Event = new(IEigenPodNonBeaconChainETHReceived) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1263,52 +1295,41 @@ func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Error() error { +func (it *IEigenPodNonBeaconChainETHReceivedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodNonBeaconChainETHWithdrawnIterator) Close() error { +func (it *IEigenPodNonBeaconChainETHReceivedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodNonBeaconChainETHWithdrawn represents a NonBeaconChainETHWithdrawn event raised by the IEigenPod contract. -type IEigenPodNonBeaconChainETHWithdrawn struct { - Recipient common.Address - AmountWithdrawn *big.Int - Raw types.Log // Blockchain specific contextual infos +// IEigenPodNonBeaconChainETHReceived represents a NonBeaconChainETHReceived event raised by the IEigenPod contract. +type IEigenPodNonBeaconChainETHReceived struct { + AmountReceived *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterNonBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// FilterNonBeaconChainETHReceived is a free log retrieval operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_IEigenPod *IEigenPodFilterer) FilterNonBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodNonBeaconChainETHWithdrawnIterator, error) { - - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) - } +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_IEigenPod *IEigenPodFilterer) FilterNonBeaconChainETHReceived(opts *bind.FilterOpts) (*IEigenPodNonBeaconChainETHReceivedIterator, error) { - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "NonBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "NonBeaconChainETHReceived") if err != nil { return nil, err } - return &IEigenPodNonBeaconChainETHWithdrawnIterator{contract: _IEigenPod.contract, event: "NonBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil + return &IEigenPodNonBeaconChainETHReceivedIterator{contract: _IEigenPod.contract, event: "NonBeaconChainETHReceived", logs: logs, sub: sub}, nil } -// WatchNonBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// WatchNonBeaconChainETHReceived is a free log subscription operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodNonBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { - - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) - } +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHReceived(opts *bind.WatchOpts, sink chan<- *IEigenPodNonBeaconChainETHReceived) (event.Subscription, error) { - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "NonBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "NonBeaconChainETHReceived") if err != nil { return nil, err } @@ -1318,8 +1339,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind. select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodNonBeaconChainETHWithdrawn) - if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHWithdrawn", log); err != nil { + event := new(IEigenPodNonBeaconChainETHReceived) + if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { return err } event.Raw = log @@ -1340,21 +1361,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchNonBeaconChainETHWithdrawn(opts *bind. }), nil } -// ParseNonBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f53096. +// ParseNonBeaconChainETHReceived is a log parse operation binding the contract event 0x6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf49. // -// Solidity: event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn) -func (_IEigenPod *IEigenPodFilterer) ParseNonBeaconChainETHWithdrawn(log types.Log) (*IEigenPodNonBeaconChainETHWithdrawn, error) { - event := new(IEigenPodNonBeaconChainETHWithdrawn) - if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHWithdrawn", log); err != nil { +// Solidity: event NonBeaconChainETHReceived(uint256 amountReceived) +func (_IEigenPod *IEigenPodFilterer) ParseNonBeaconChainETHReceived(log types.Log) (*IEigenPodNonBeaconChainETHReceived, error) { + event := new(IEigenPodNonBeaconChainETHReceived) + if err := _IEigenPod.contract.UnpackLog(event, "NonBeaconChainETHReceived", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodPartialWithdrawalRedeemedIterator is returned from FilterPartialWithdrawalRedeemed and is used to iterate over the raw logs and unpacked data for PartialWithdrawalRedeemed events raised by the IEigenPod contract. -type IEigenPodPartialWithdrawalRedeemedIterator struct { - Event *IEigenPodPartialWithdrawalRedeemed // Event containing the contract specifics and raw log +// IEigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the IEigenPod contract. +type IEigenPodRestakedBeaconChainETHWithdrawnIterator struct { + Event *IEigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1368,7 +1389,7 @@ type IEigenPodPartialWithdrawalRedeemedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodPartialWithdrawalRedeemedIterator) Next() bool { +func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1377,7 +1398,7 @@ func (it *IEigenPodPartialWithdrawalRedeemedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodPartialWithdrawalRedeemed) + it.Event = new(IEigenPodRestakedBeaconChainETHWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1392,7 +1413,7 @@ func (it *IEigenPodPartialWithdrawalRedeemedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodPartialWithdrawalRedeemed) + it.Event = new(IEigenPodRestakedBeaconChainETHWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1408,54 +1429,52 @@ func (it *IEigenPodPartialWithdrawalRedeemedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodPartialWithdrawalRedeemedIterator) Error() error { +func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodPartialWithdrawalRedeemedIterator) Close() error { +func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodPartialWithdrawalRedeemed represents a PartialWithdrawalRedeemed event raised by the IEigenPod contract. -type IEigenPodPartialWithdrawalRedeemed struct { - ValidatorIndex *big.Int - WithdrawalTimestamp uint64 - Recipient common.Address - PartialWithdrawalAmountGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// IEigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the IEigenPod contract. +type IEigenPodRestakedBeaconChainETHWithdrawn struct { + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterPartialWithdrawalRedeemed is a free log retrieval operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) FilterPartialWithdrawalRedeemed(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodPartialWithdrawalRedeemedIterator, error) { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_IEigenPod *IEigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodRestakedBeaconChainETHWithdrawnIterator, error) { var recipientRule []interface{} for _, recipientItem := range recipient { recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "PartialWithdrawalRedeemed", recipientRule) + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) if err != nil { return nil, err } - return &IEigenPodPartialWithdrawalRedeemedIterator{contract: _IEigenPod.contract, event: "PartialWithdrawalRedeemed", logs: logs, sub: sub}, nil + return &IEigenPodRestakedBeaconChainETHWithdrawnIterator{contract: _IEigenPod.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil } -// WatchPartialWithdrawalRedeemed is a free log subscription operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.WatchOpts, sink chan<- *IEigenPodPartialWithdrawalRedeemed, recipient []common.Address) (event.Subscription, error) { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_IEigenPod *IEigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { var recipientRule []interface{} for _, recipientItem := range recipient { recipientRule = append(recipientRule, recipientItem) } - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "PartialWithdrawalRedeemed", recipientRule) + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) if err != nil { return nil, err } @@ -1465,8 +1484,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.W select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodPartialWithdrawalRedeemed) - if err := _IEigenPod.contract.UnpackLog(event, "PartialWithdrawalRedeemed", log); err != nil { + event := new(IEigenPodRestakedBeaconChainETHWithdrawn) + if err := _IEigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { return err } event.Raw = log @@ -1487,21 +1506,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchPartialWithdrawalRedeemed(opts *bind.W }), nil } -// ParsePartialWithdrawalRedeemed is a log parse operation binding the contract event 0x8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e. +// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. // -// Solidity: event PartialWithdrawalRedeemed(uint40 validatorIndex, uint64 withdrawalTimestamp, address indexed recipient, uint64 partialWithdrawalAmountGwei) -func (_IEigenPod *IEigenPodFilterer) ParsePartialWithdrawalRedeemed(log types.Log) (*IEigenPodPartialWithdrawalRedeemed, error) { - event := new(IEigenPodPartialWithdrawalRedeemed) - if err := _IEigenPod.contract.UnpackLog(event, "PartialWithdrawalRedeemed", log); err != nil { +// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) +func (_IEigenPod *IEigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*IEigenPodRestakedBeaconChainETHWithdrawn, error) { + event := new(IEigenPodRestakedBeaconChainETHWithdrawn) + if err := _IEigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodRestakedBeaconChainETHWithdrawnIterator is returned from FilterRestakedBeaconChainETHWithdrawn and is used to iterate over the raw logs and unpacked data for RestakedBeaconChainETHWithdrawn events raised by the IEigenPod contract. -type IEigenPodRestakedBeaconChainETHWithdrawnIterator struct { - Event *IEigenPodRestakedBeaconChainETHWithdrawn // Event containing the contract specifics and raw log +// IEigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the IEigenPod contract. +type IEigenPodRestakingActivatedIterator struct { + Event *IEigenPodRestakingActivated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1515,7 +1534,7 @@ type IEigenPodRestakedBeaconChainETHWithdrawnIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { +func (it *IEigenPodRestakingActivatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1524,7 +1543,7 @@ func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodRestakedBeaconChainETHWithdrawn) + it.Event = new(IEigenPodRestakingActivated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1539,7 +1558,7 @@ func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodRestakedBeaconChainETHWithdrawn) + it.Event = new(IEigenPodRestakingActivated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1555,52 +1574,51 @@ func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Error() error { +func (it *IEigenPodRestakingActivatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodRestakedBeaconChainETHWithdrawnIterator) Close() error { +func (it *IEigenPodRestakingActivatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodRestakedBeaconChainETHWithdrawn represents a RestakedBeaconChainETHWithdrawn event raised by the IEigenPod contract. -type IEigenPodRestakedBeaconChainETHWithdrawn struct { - Recipient common.Address - Amount *big.Int - Raw types.Log // Blockchain specific contextual infos +// IEigenPodRestakingActivated represents a RestakingActivated event raised by the IEigenPod contract. +type IEigenPodRestakingActivated struct { + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterRestakedBeaconChainETHWithdrawn is a free log retrieval operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_IEigenPod *IEigenPodFilterer) FilterRestakedBeaconChainETHWithdrawn(opts *bind.FilterOpts, recipient []common.Address) (*IEigenPodRestakedBeaconChainETHWithdrawnIterator, error) { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_IEigenPod *IEigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodRestakingActivatedIterator, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) } - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) if err != nil { return nil, err } - return &IEigenPodRestakedBeaconChainETHWithdrawnIterator{contract: _IEigenPod.contract, event: "RestakedBeaconChainETHWithdrawn", logs: logs, sub: sub}, nil + return &IEigenPodRestakingActivatedIterator{contract: _IEigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil } -// WatchRestakedBeaconChainETHWithdrawn is a free log subscription operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_IEigenPod *IEigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakedBeaconChainETHWithdrawn, recipient []common.Address) (event.Subscription, error) { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_IEigenPod *IEigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) } - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "RestakedBeaconChainETHWithdrawn", recipientRule) + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) if err != nil { return nil, err } @@ -1610,8 +1628,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts * select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodRestakedBeaconChainETHWithdrawn) - if err := _IEigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { + event := new(IEigenPodRestakingActivated) + if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { return err } event.Raw = log @@ -1632,21 +1650,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchRestakedBeaconChainETHWithdrawn(opts * }), nil } -// ParseRestakedBeaconChainETHWithdrawn is a log parse operation binding the contract event 0x8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e. +// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. // -// Solidity: event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount) -func (_IEigenPod *IEigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log types.Log) (*IEigenPodRestakedBeaconChainETHWithdrawn, error) { - event := new(IEigenPodRestakedBeaconChainETHWithdrawn) - if err := _IEigenPod.contract.UnpackLog(event, "RestakedBeaconChainETHWithdrawn", log); err != nil { +// Solidity: event RestakingActivated(address indexed podOwner) +func (_IEigenPod *IEigenPodFilterer) ParseRestakingActivated(log types.Log) (*IEigenPodRestakingActivated, error) { + event := new(IEigenPodRestakingActivated) + if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the IEigenPod contract. -type IEigenPodRestakingActivatedIterator struct { - Event *IEigenPodRestakingActivated // Event containing the contract specifics and raw log +// IEigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the IEigenPod contract. +type IEigenPodValidatorBalanceUpdatedIterator struct { + Event *IEigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1660,7 +1678,7 @@ type IEigenPodRestakingActivatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodRestakingActivatedIterator) Next() bool { +func (it *IEigenPodValidatorBalanceUpdatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1669,7 +1687,7 @@ func (it *IEigenPodRestakingActivatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodRestakingActivated) + it.Event = new(IEigenPodValidatorBalanceUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1684,7 +1702,7 @@ func (it *IEigenPodRestakingActivatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodRestakingActivated) + it.Event = new(IEigenPodValidatorBalanceUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1700,51 +1718,43 @@ func (it *IEigenPodRestakingActivatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodRestakingActivatedIterator) Error() error { +func (it *IEigenPodValidatorBalanceUpdatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodRestakingActivatedIterator) Close() error { +func (it *IEigenPodValidatorBalanceUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodRestakingActivated represents a RestakingActivated event raised by the IEigenPod contract. -type IEigenPodRestakingActivated struct { - PodOwner common.Address - Raw types.Log // Blockchain specific contextual infos +// IEigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the IEigenPod contract. +type IEigenPodValidatorBalanceUpdated struct { + ValidatorIndex *big.Int + BalanceTimestamp uint64 + NewValidatorBalanceGwei uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodRestakingActivatedIterator, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_IEigenPod *IEigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*IEigenPodValidatorBalanceUpdatedIterator, error) { - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "ValidatorBalanceUpdated") if err != nil { return nil, err } - return &IEigenPodRestakingActivatedIterator{contract: _IEigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil + return &IEigenPodValidatorBalanceUpdatedIterator{contract: _IEigenPod.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil } -// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_IEigenPod *IEigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorBalanceUpdated) (event.Subscription, error) { - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "ValidatorBalanceUpdated") if err != nil { return nil, err } @@ -1754,8 +1764,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpt select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodRestakingActivated) - if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { + event := new(IEigenPodValidatorBalanceUpdated) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { return err } event.Raw = log @@ -1776,21 +1786,21 @@ func (_IEigenPod *IEigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpt }), nil } -// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. +// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. // -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) ParseRestakingActivated(log types.Log) (*IEigenPodRestakingActivated, error) { - event := new(IEigenPodRestakingActivated) - if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { +// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) +func (_IEigenPod *IEigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*IEigenPodValidatorBalanceUpdated, error) { + event := new(IEigenPodValidatorBalanceUpdated) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// IEigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the IEigenPod contract. -type IEigenPodValidatorBalanceUpdatedIterator struct { - Event *IEigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log +// IEigenPodValidatorCheckpointedIterator is returned from FilterValidatorCheckpointed and is used to iterate over the raw logs and unpacked data for ValidatorCheckpointed events raised by the IEigenPod contract. +type IEigenPodValidatorCheckpointedIterator struct { + Event *IEigenPodValidatorCheckpointed // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1804,7 +1814,7 @@ type IEigenPodValidatorBalanceUpdatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *IEigenPodValidatorBalanceUpdatedIterator) Next() bool { +func (it *IEigenPodValidatorCheckpointedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1813,7 +1823,7 @@ func (it *IEigenPodValidatorBalanceUpdatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(IEigenPodValidatorBalanceUpdated) + it.Event = new(IEigenPodValidatorCheckpointed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1828,7 +1838,7 @@ func (it *IEigenPodValidatorBalanceUpdatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(IEigenPodValidatorBalanceUpdated) + it.Event = new(IEigenPodValidatorCheckpointed) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1844,43 +1854,60 @@ func (it *IEigenPodValidatorBalanceUpdatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodValidatorBalanceUpdatedIterator) Error() error { +func (it *IEigenPodValidatorCheckpointedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *IEigenPodValidatorBalanceUpdatedIterator) Close() error { +func (it *IEigenPodValidatorCheckpointedIterator) Close() error { it.sub.Unsubscribe() return nil } -// IEigenPodValidatorBalanceUpdated represents a ValidatorBalanceUpdated event raised by the IEigenPod contract. -type IEigenPodValidatorBalanceUpdated struct { - ValidatorIndex *big.Int - BalanceTimestamp uint64 - NewValidatorBalanceGwei uint64 - Raw types.Log // Blockchain specific contextual infos +// IEigenPodValidatorCheckpointed represents a ValidatorCheckpointed event raised by the IEigenPod contract. +type IEigenPodValidatorCheckpointed struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorBalanceUpdated is a free log retrieval operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// FilterValidatorCheckpointed is a free log retrieval operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_IEigenPod *IEigenPodFilterer) FilterValidatorBalanceUpdated(opts *bind.FilterOpts) (*IEigenPodValidatorBalanceUpdatedIterator, error) { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) FilterValidatorCheckpointed(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*IEigenPodValidatorCheckpointedIterator, error) { - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "ValidatorBalanceUpdated") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) if err != nil { return nil, err } - return &IEigenPodValidatorBalanceUpdatedIterator{contract: _IEigenPod.contract, event: "ValidatorBalanceUpdated", logs: logs, sub: sub}, nil + return &IEigenPodValidatorCheckpointedIterator{contract: _IEigenPod.contract, event: "ValidatorCheckpointed", logs: logs, sub: sub}, nil } -// WatchValidatorBalanceUpdated is a free log subscription operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// WatchValidatorCheckpointed is a free log subscription operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_IEigenPod *IEigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorBalanceUpdated) (event.Subscription, error) { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) WatchValidatorCheckpointed(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorCheckpointed, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "ValidatorBalanceUpdated") + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "ValidatorCheckpointed", checkpointTimestampRule, validatorIndexRule) if err != nil { return nil, err } @@ -1890,8 +1917,8 @@ func (_IEigenPod *IEigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.Wat select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(IEigenPodValidatorBalanceUpdated) - if err := _IEigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { + event := new(IEigenPodValidatorCheckpointed) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { return err } event.Raw = log @@ -1912,12 +1939,12 @@ func (_IEigenPod *IEigenPodFilterer) WatchValidatorBalanceUpdated(opts *bind.Wat }), nil } -// ParseValidatorBalanceUpdated is a log parse operation binding the contract event 0x0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df. +// ParseValidatorCheckpointed is a log parse operation binding the contract event 0xa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f. // -// Solidity: event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei) -func (_IEigenPod *IEigenPodFilterer) ParseValidatorBalanceUpdated(log types.Log) (*IEigenPodValidatorBalanceUpdated, error) { - event := new(IEigenPodValidatorBalanceUpdated) - if err := _IEigenPod.contract.UnpackLog(event, "ValidatorBalanceUpdated", log); err != nil { +// Solidity: event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) ParseValidatorCheckpointed(log types.Log) (*IEigenPodValidatorCheckpointed, error) { + event := new(IEigenPodValidatorCheckpointed) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorCheckpointed", log); err != nil { return nil, err } event.Raw = log @@ -2057,3 +2084,156 @@ func (_IEigenPod *IEigenPodFilterer) ParseValidatorRestaked(log types.Log) (*IEi event.Raw = log return event, nil } + +// IEigenPodValidatorWithdrawnIterator is returned from FilterValidatorWithdrawn and is used to iterate over the raw logs and unpacked data for ValidatorWithdrawn events raised by the IEigenPod contract. +type IEigenPodValidatorWithdrawnIterator struct { + Event *IEigenPodValidatorWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IEigenPodValidatorWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IEigenPodValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IEigenPodValidatorWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IEigenPodValidatorWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IEigenPodValidatorWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IEigenPodValidatorWithdrawn represents a ValidatorWithdrawn event raised by the IEigenPod contract. +type IEigenPodValidatorWithdrawn struct { + CheckpointTimestamp uint64 + ValidatorIndex *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWithdrawn is a free log retrieval operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) FilterValidatorWithdrawn(opts *bind.FilterOpts, checkpointTimestamp []uint64, validatorIndex []*big.Int) (*IEigenPodValidatorWithdrawnIterator, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return &IEigenPodValidatorWithdrawnIterator{contract: _IEigenPod.contract, event: "ValidatorWithdrawn", logs: logs, sub: sub}, nil +} + +// WatchValidatorWithdrawn is a free log subscription operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) WatchValidatorWithdrawn(opts *bind.WatchOpts, sink chan<- *IEigenPodValidatorWithdrawn, checkpointTimestamp []uint64, validatorIndex []*big.Int) (event.Subscription, error) { + + var checkpointTimestampRule []interface{} + for _, checkpointTimestampItem := range checkpointTimestamp { + checkpointTimestampRule = append(checkpointTimestampRule, checkpointTimestampItem) + } + var validatorIndexRule []interface{} + for _, validatorIndexItem := range validatorIndex { + validatorIndexRule = append(validatorIndexRule, validatorIndexItem) + } + + logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "ValidatorWithdrawn", checkpointTimestampRule, validatorIndexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IEigenPodValidatorWithdrawn) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWithdrawn is a log parse operation binding the contract event 0x2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a. +// +// Solidity: event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex) +func (_IEigenPod *IEigenPodFilterer) ParseValidatorWithdrawn(log types.Log) (*IEigenPodValidatorWithdrawn, error) { + event := new(IEigenPodValidatorWithdrawn) + if err := _IEigenPod.contract.UnpackLog(event, "ValidatorWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/IEigenPodManager/binding.go b/pkg/bindings/IEigenPodManager/binding.go index e4e8150ef..a2b9e41b6 100644 --- a/pkg/bindings/IEigenPodManager/binding.go +++ b/pkg/bindings/IEigenPodManager/binding.go @@ -31,7 +31,7 @@ var ( // IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract. var IEigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"getBlockRootAtTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateBeaconChainOracle\",\"inputs\":[{\"name\":\"newBeaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", } // IEigenPodManagerABI is the input ABI used to generate the binding from. @@ -211,37 +211,6 @@ func (_IEigenPodManager *IEigenPodManagerCallerSession) BeaconChainETHStrategy() return _IEigenPodManager.Contract.BeaconChainETHStrategy(&_IEigenPodManager.CallOpts) } -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_IEigenPodManager *IEigenPodManagerCaller) BeaconChainOracle(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _IEigenPodManager.contract.Call(opts, &out, "beaconChainOracle") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_IEigenPodManager *IEigenPodManagerSession) BeaconChainOracle() (common.Address, error) { - return _IEigenPodManager.Contract.BeaconChainOracle(&_IEigenPodManager.CallOpts) -} - -// BeaconChainOracle is a free data retrieval call binding the contract method 0xc052bd61. -// -// Solidity: function beaconChainOracle() view returns(address) -func (_IEigenPodManager *IEigenPodManagerCallerSession) BeaconChainOracle() (common.Address, error) { - return _IEigenPodManager.Contract.BeaconChainOracle(&_IEigenPodManager.CallOpts) -} - // DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. // // Solidity: function denebForkTimestamp() view returns(uint64) @@ -335,37 +304,6 @@ func (_IEigenPodManager *IEigenPodManagerCallerSession) EthPOS() (common.Address return _IEigenPodManager.Contract.EthPOS(&_IEigenPodManager.CallOpts) } -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_IEigenPodManager *IEigenPodManagerCaller) GetBlockRootAtTimestamp(opts *bind.CallOpts, timestamp uint64) ([32]byte, error) { - var out []interface{} - err := _IEigenPodManager.contract.Call(opts, &out, "getBlockRootAtTimestamp", timestamp) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_IEigenPodManager *IEigenPodManagerSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _IEigenPodManager.Contract.GetBlockRootAtTimestamp(&_IEigenPodManager.CallOpts, timestamp) -} - -// GetBlockRootAtTimestamp is a free data retrieval call binding the contract method 0xd1c64cc9. -// -// Solidity: function getBlockRootAtTimestamp(uint64 timestamp) view returns(bytes32) -func (_IEigenPodManager *IEigenPodManagerCallerSession) GetBlockRootAtTimestamp(timestamp uint64) ([32]byte, error) { - return _IEigenPodManager.Contract.GetBlockRootAtTimestamp(&_IEigenPodManager.CallOpts, timestamp) -} - // GetPod is a free data retrieval call binding the contract method 0xa38406a3. // // Solidity: function getPod(address podOwner) view returns(address) @@ -886,27 +824,6 @@ func (_IEigenPodManager *IEigenPodManagerTransactorSession) Unpause(newPausedSta return _IEigenPodManager.Contract.Unpause(&_IEigenPodManager.TransactOpts, newPausedStatus) } -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_IEigenPodManager *IEigenPodManagerTransactor) UpdateBeaconChainOracle(opts *bind.TransactOpts, newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _IEigenPodManager.contract.Transact(opts, "updateBeaconChainOracle", newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_IEigenPodManager *IEigenPodManagerSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _IEigenPodManager.Contract.UpdateBeaconChainOracle(&_IEigenPodManager.TransactOpts, newBeaconChainOracle) -} - -// UpdateBeaconChainOracle is a paid mutator transaction binding the contract method 0xc1de3aef. -// -// Solidity: function updateBeaconChainOracle(address newBeaconChainOracle) returns() -func (_IEigenPodManager *IEigenPodManagerTransactorSession) UpdateBeaconChainOracle(newBeaconChainOracle common.Address) (*types.Transaction, error) { - return _IEigenPodManager.Contract.UpdateBeaconChainOracle(&_IEigenPodManager.TransactOpts, newBeaconChainOracle) -} - // WithdrawSharesAsTokens is a paid mutator transaction binding the contract method 0x387b1300. // // Solidity: function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) returns() diff --git a/pkg/bindings/Merkle/binding.go b/pkg/bindings/Merkle/binding.go index 77f0a1f86..97d61407c 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: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122098d7de6cb617cd25193954b2c2ef2039a83bd2bc8752b047e8a5b8540f0391f864736f6c634300080c0033", + Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209e5b8dca1f4a44a281a9fc7dc030d961fbeb9418ec87f1fabad9d90371e21da464736f6c634300080c0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Pausable/binding.go b/pkg/bindings/Pausable/binding.go index c680341d5..8d81956bc 100644 --- a/pkg/bindings/Pausable/binding.go +++ b/pkg/bindings/Pausable/binding.go @@ -32,7 +32,7 @@ var ( // PausableMetaData contains all meta data concerning the Pausable contract. var PausableMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b506107c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100b25780635c975abb146100e6578063886f1195146100f7578063fabc1cbc1461012257600080fd5b806310d67a2f14610082578063136439dd14610097578063595c6a67146100aa575b600080fd5b61009561009036600461065b565b610135565b005b6100956100a536600461067f565b6101ef565b61009561032e565b6100d16100c0366004610698565b6001805460ff9092161b9081161490565b60405190151581526020015b60405180910390f35b6001546040519081526020016100dd565b60005461010a906001600160a01b031681565b6040516001600160a01b0390911681526020016100dd565b61009561013036600461067f565b6103f5565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101aa91906106bb565b6001600160a01b0316336001600160a01b0316146101e35760405162461bcd60e51b81526004016101da906106d8565b60405180910390fd5b6101ec8161054f565b50565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610722565b6102775760405162461bcd60e51b81526004016101da90610744565b600154818116146102f05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039a9190610722565b6103b65760405162461bcd60e51b81526004016101da90610744565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046a91906106bb565b6001600160a01b0316336001600160a01b03161461049a5760405162461bcd60e51b81526004016101da906106d8565b6001541981196001541916146105185760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610323565b6001600160a01b0381166105dd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016101da565b600054604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146101ec57600080fd5b60006020828403121561066d57600080fd5b813561067881610646565b9392505050565b60006020828403121561069157600080fd5b5035919050565b6000602082840312156106aa57600080fd5b813560ff8116811461067857600080fd5b6000602082840312156106cd57600080fd5b815161067881610646565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561073457600080fd5b8151801515811461067857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea26469706673582212206ec8660c90f9020eac1acdb7cf9763b01b3517dc730fb33c9aceb4c71197896f64736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b50610ec3806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100c45780635c975abb146100f4578063886f119514610112578063fabc1cbc146101305761007d565b806310d67a2f14610082578063136439dd1461009e578063595c6a67146100ba575b600080fd5b61009c600480360381019061009791906108a7565b61014c565b005b6100b860048036038101906100b3919061090a565b610254565b005b6100c26103cd565b005b6100de60048036038101906100d99190610970565b61053d565b6040516100eb91906109b8565b60405180910390f35b6100fc610559565b60405161010991906109e2565b60405180910390f35b61011a610563565b6040516101279190610a5c565b60405180910390f35b61014a6004803603810190610145919061090a565b610587565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db9190610aa3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023f90610b53565b60405180910390fd5b61025181610726565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016102ad9190610b82565b602060405180830381865afa1580156102ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ee9190610bc9565b61032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032490610c68565b60405180910390fd5b600154816001541614610375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036c90610cfa565b60405180910390fd5b806001819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d826040516103c291906109e2565b60405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016104269190610b82565b602060405180830381865afa158015610443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104679190610bc9565b6104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049d90610c68565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405161053391906109e2565b60405180910390a2565b6000808260ff166001901b905080816001541614915050919050565b6000600154905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610aa3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a90610b53565b60405180910390fd5b6001541981196001541916146106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c590610d8c565b60405180910390fd5b806001819055503373ffffffffffffffffffffffffffffffffffffffff167f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c8260405161071b91906109e2565b60405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d90610e44565b60405180910390fd5b7f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516107e7929190610e64565b60405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061086282610837565b9050919050565b600061087482610857565b9050919050565b61088481610869565b811461088f57600080fd5b50565b6000813590506108a18161087b565b92915050565b6000602082840312156108bd576108bc610832565b5b60006108cb84828501610892565b91505092915050565b6000819050919050565b6108e7816108d4565b81146108f257600080fd5b50565b600081359050610904816108de565b92915050565b6000602082840312156109205761091f610832565b5b600061092e848285016108f5565b91505092915050565b600060ff82169050919050565b61094d81610937565b811461095857600080fd5b50565b60008135905061096a81610944565b92915050565b60006020828403121561098657610985610832565b5b60006109948482850161095b565b91505092915050565b60008115159050919050565b6109b28161099d565b82525050565b60006020820190506109cd60008301846109a9565b92915050565b6109dc816108d4565b82525050565b60006020820190506109f760008301846109d3565b92915050565b6000819050919050565b6000610a22610a1d610a1884610837565b6109fd565b610837565b9050919050565b6000610a3482610a07565b9050919050565b6000610a4682610a29565b9050919050565b610a5681610a3b565b82525050565b6000602082019050610a716000830184610a4d565b92915050565b610a8081610857565b8114610a8b57600080fd5b50565b600081519050610a9d81610a77565b92915050565b600060208284031215610ab957610ab8610832565b5b6000610ac784828501610a8e565b91505092915050565b600082825260208201905092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320756e70617573657200000000000000000000000000000000000000000000602082015250565b6000610b3d602a83610ad0565b9150610b4882610ae1565b604082019050919050565b60006020820190508181036000830152610b6c81610b30565b9050919050565b610b7c81610857565b82525050565b6000602082019050610b976000830184610b73565b92915050565b610ba68161099d565b8114610bb157600080fd5b50565b600081519050610bc381610b9d565b92915050565b600060208284031215610bdf57610bde610832565b5b6000610bed84828501610bb4565b91505092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320706175736572000000000000000000000000000000000000000000000000602082015250565b6000610c52602883610ad0565b9150610c5d82610bf6565b604082019050919050565b60006020820190508181036000830152610c8181610c45565b9050919050565b7f5061757361626c652e70617573653a20696e76616c696420617474656d70742060008201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000602082015250565b6000610ce4603883610ad0565b9150610cef82610c88565b604082019050919050565b60006020820190508181036000830152610d1381610cd7565b9050919050565b7f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060008201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000602082015250565b6000610d76603883610ad0565b9150610d8182610d1a565b604082019050919050565b60006020820190508181036000830152610da581610d69565b9050919050565b7f5061757361626c652e5f73657450617573657252656769737472793a206e657760008201527f50617573657252656769737472792063616e6e6f7420626520746865207a657260208201527f6f20616464726573730000000000000000000000000000000000000000000000604082015250565b6000610e2e604983610ad0565b9150610e3982610dac565b606082019050919050565b60006020820190508181036000830152610e5d81610e21565b9050919050565b6000604082019050610e796000830185610a4d565b610e866020830184610a4d565b939250505056fea2646970667358221220fd39cf86e6b9898a36eabe54f5c757a773f716b61627456f2d9670d882c8f64464736f6c634300080c0033", } // PausableABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index 121537674..3c963830b 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}]", - Bin: "0x608060405234801561001057600080fd5b5060405161077838038061077883398101604081905261002f91610263565b60005b82518110156100775761006583828151811061005057610050610339565b6020026020010151600161008860201b60201c565b8061006f8161034f565b915050610032565b506100818161015a565b5050610378565b6001600160a01b0382166100f95760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b60648201526084015b60405180910390fd5b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101c85760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b60648201526084016100f0565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b038116811461025e57600080fd5b919050565b6000806040838503121561027657600080fd5b82516001600160401b038082111561028d57600080fd5b818501915085601f8301126102a157600080fd5b81516020828211156102b5576102b5610231565b8160051b604051601f19603f830116810181811086821117156102da576102da610231565b6040529283528183019350848101820192898411156102f857600080fd5b948201945b8386101561031d5761030e86610247565b855294820194938201936102fd565b965061032c9050878201610247565b9450505050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561037157634e487b7160e01b600052601160045260246000fd5b5060010190565b6103f1806103876000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212209d16b337e572efd6aa7c9a1f129223998361e2c66fd3f3315454d1a0590f6f0e64736f6c634300080c0033", + Bin: "0x60806040523480156200001157600080fd5b5060405162000fb738038062000fb78339818101604052810190620000379190620004ae565b60005b82518110156200008a57620000748382815181106200005e576200005d62000514565b5b60200260200101516001620000a460201b60201c565b808062000081906200057c565b9150506200003a565b506200009c81620001ac60201b60201c565b505062000793565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010e9062000651565b60405180910390fd5b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b91528282604051620001a0929190620006a1565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200021f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002169062000744565b60405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516200027492919062000766565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200032482620002d9565b810181811067ffffffffffffffff82111715620003465762000345620002ea565b5b80604052505050565b60006200035b620002c0565b905062000369828262000319565b919050565b600067ffffffffffffffff8211156200038c576200038b620002ea565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003cf82620003a2565b9050919050565b620003e181620003c2565b8114620003ed57600080fd5b50565b6000815190506200040181620003d6565b92915050565b60006200041e62000418846200036e565b6200034f565b905080838252602082019050602084028301858111156200044457620004436200039d565b5b835b818110156200047157806200045c8882620003f0565b84526020840193505060208101905062000446565b5050509392505050565b600082601f830112620004935762000492620002d4565b5b8151620004a584826020860162000407565b91505092915050565b60008060408385031215620004c857620004c7620002ca565b5b600083015167ffffffffffffffff811115620004e957620004e8620002cf565b5b620004f7858286016200047b565b92505060206200050a85828601620003f0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620005898262000572565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620005bf57620005be62000543565b5b600182019050919050565b600082825260208201905092915050565b7f50617573657252656769737472792e5f7365745061757365723a207a65726f2060008201527f6164647265737320696e70757400000000000000000000000000000000000000602082015250565b600062000639602d83620005ca565b91506200064682620005db565b604082019050919050565b600060208201905081810360008301526200066c816200062a565b9050919050565b6200067e81620003c2565b82525050565b60008115159050919050565b6200069b8162000684565b82525050565b6000604082019050620006b8600083018562000673565b620006c7602083018462000690565b9392505050565b7f50617573657252656769737472792e5f736574556e7061757365723a207a657260008201527f6f206164647265737320696e7075740000000000000000000000000000000000602082015250565b60006200072c602f83620005ca565b91506200073982620006ce565b604082019050919050565b600060208201905081810360008301526200075f816200071d565b9050919050565b60006040820190506200077d600083018562000673565b6200078c602083018462000673565b9392505050565b61081480620007a36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610081578063ce5484281461009d578063eab66d7a146100b9575b600080fd5b61006b600480360381019061006691906104cc565b6100d7565b6040516100789190610514565b60405180910390f35b61009b6004803603810190610096919061055b565b6100f7565b005b6100b760048036038101906100b291906104cc565b610195565b005b6100c1610231565b6040516100ce91906105aa565b60405180910390f35b60006020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017e90610648565b60405180910390fd5b6101918282610257565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610648565b60405180910390fd5b61022e8161035a565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156102c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102be906106da565b60405180910390fd5b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152828260405161034e9291906106fa565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156103ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c190610795565b60405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161041d9291906107b5565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104998261046e565b9050919050565b6104a98161048e565b81146104b457600080fd5b50565b6000813590506104c6816104a0565b92915050565b6000602082840312156104e2576104e1610469565b5b60006104f0848285016104b7565b91505092915050565b60008115159050919050565b61050e816104f9565b82525050565b60006020820190506105296000830184610505565b92915050565b610538816104f9565b811461054357600080fd5b50565b6000813590506105558161052f565b92915050565b6000806040838503121561057257610571610469565b5b6000610580858286016104b7565b925050602061059185828601610546565b9150509250929050565b6105a48161048e565b82525050565b60006020820190506105bf600083018461059b565b92915050565b600082825260208201905092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320756e70617573657200000000000000000000000000000000000000000000602082015250565b6000610632602a836105c5565b915061063d826105d6565b604082019050919050565b6000602082019050818103600083015261066181610625565b9050919050565b7f50617573657252656769737472792e5f7365745061757365723a207a65726f2060008201527f6164647265737320696e70757400000000000000000000000000000000000000602082015250565b60006106c4602d836105c5565b91506106cf82610668565b604082019050919050565b600060208201905081810360008301526106f3816106b7565b9050919050565b600060408201905061070f600083018561059b565b61071c6020830184610505565b9392505050565b7f50617573657252656769737472792e5f736574556e7061757365723a207a657260008201527f6f206164647265737320696e7075740000000000000000000000000000000000602082015250565b600061077f602f836105c5565b915061078a82610723565b604082019050919050565b600060208201905081810360008301526107ae81610772565b9050919050565b60006040820190506107ca600083018561059b565b6107d7602083018461059b565b939250505056fea2646970667358221220dee6ed19db09bc37305aba952b65a49b4592b68c389c789ca9ab8cea5043277c64736f6c634300080c0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index a00a4b474..a2f204bba 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212200a55f6555e53c169bfe29d78001c97cce8454a4157481f42d2371294c4a418d764736f6c634300080c0033", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212204de0cd662d4e6add8e32c7f6cc0e78dd41e2a83aedbb97d6d65eb6f376a3805764736f6c634300080c0033", } // RewardsCoordinatorABI 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 d41976ee7..6f5afb2a1 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212204d8078f9ac08ba4dbebb1615cf10601232ed8568a15ce36e6041a470ee981fa664736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200b2d1bf2882b0da8db5f597f065ececc94ce995a673448b41e103ac2f6019bc064736f6c634300080c0033", } // 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 facc3efa2..aa585756f 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220d4da480420c9bb35fdae2778978bf5034e54cdf448f8732c71657597c03e8b7364736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200df93bb52333124fa856fc8d410b8eb351ddf7fef3390a242c22221a8da36be464736f6c634300080c0033", } // StrategyBaseTVLLimitsABI 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 635a9cae9..b718b5e5e 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea264697066735822122032106a36c8591dee923b8d92845aa71f5a58dd4597c60ee2c7cef66313762edb64736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea26469706673582212207c20b61435ee67af08f5918d6b67a437de601ceee7a7259d0ad5f0709aa618c364736f6c634300080c0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StructuredLinkedList/binding.go b/pkg/bindings/StructuredLinkedList/binding.go index b291ef98d..fce8e2a1b 100644 --- a/pkg/bindings/StructuredLinkedList/binding.go +++ b/pkg/bindings/StructuredLinkedList/binding.go @@ -32,7 +32,7 @@ var ( // StructuredLinkedListMetaData contains all meta data concerning the StructuredLinkedList contract. var StructuredLinkedListMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200b0f3aa07997f25ddb2b0dd17a1b6104304d811d2cec7f2d2dfcae3e3d618f6964736f6c634300080c0033", + Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203f4bd551859e3b28b35aafb07ba9fb58f0306ef37f8e64e99104da2a585c7c4a64736f6c634300080c0033", } // StructuredLinkedListABI is the input ABI used to generate the binding from. diff --git a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol index 78123a7bf..0d744f931 100644 --- a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol +++ b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol @@ -84,7 +84,7 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { eigenLayerProxyAdmin = ProxyAdmin(stdJson.readAddress(deployment_data, ".addresses.eigenLayerProxyAdmin")); genesisTimeBefore = EigenPod(payable(eigenPodBeacon.implementation())).GENESIS_TIME(); - maxRestakedBalanceBefore = EigenPod(payable(eigenPodBeacon.implementation())).MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(); + // maxRestakedBalanceBefore = EigenPod(payable(eigenPodBeacon.implementation())).MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(); delayedWithdrawalRouter = EigenPod(payable(eigenPodBeacon.implementation())).delayedWithdrawalRouter(); // Begin deployment @@ -95,7 +95,7 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { _ethPOS: ethPOS, _delayedWithdrawalRouter: delayedWithdrawalRouter, _eigenPodManager: eigenPodManager, - _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR: maxRestakedBalanceBefore, + // _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR: maxRestakedBalanceBefore, _GENESIS_TIME: genesisTimeBefore }); @@ -150,13 +150,13 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { require(eigenPodImplementation.eigenPodManager() == eigenPodManager, "eigenPodManager set incorrectly"); // check that values are unchanged - require(eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == maxRestakedBalanceBefore, - "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR set incorrectly"); + // require(eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == maxRestakedBalanceBefore, + // "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR set incorrectly"); require(eigenPodImplementation.GENESIS_TIME() == genesisTimeBefore, "GENESIS_TIME set incorrectly"); // redundant checks on correct values - require(eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == 32 gwei, - "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR set incorrectly"); + // require(eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == 32 gwei, + // "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR set incorrectly"); require(eigenPodImplementation.GENESIS_TIME() == 1606824023, "GENESIS_TIME set incorrectly"); diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 44e1c3940..e8dc27625 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -513,15 +513,11 @@ contract ExistingDeploymentParser is Script, Test { strategyManager.initialize(address(0), address(0), eigenLayerPauserReg, STRATEGY_MANAGER_INIT_PAUSED_STATUS); // EigenPodManager vm.expectRevert(bytes("Initializable: contract is already initialized")); -<<<<<<< HEAD - eigenPodManager.initialize(beaconOracle, address(0), eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS); -======= eigenPodManager.initialize( address(0), eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS ); ->>>>>>> a524406e (feat: poc for partial withdrawal batching) // DelayedWithdrawalRouter vm.expectRevert(bytes("Initializable: contract is already initialized")); delayedWithdrawalRouter.initialize( @@ -661,15 +657,6 @@ contract ExistingDeploymentParser is Script, Test { "eigenPodImplementation: GENESIS TIME not set correctly" ); require( -<<<<<<< HEAD - eigenPodImplementation.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() == - EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR && - EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR % 1 gwei == 0, - "eigenPodImplementation: MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR not set correctly" - ); - require( -======= ->>>>>>> a524406e (feat: poc for partial withdrawal batching) eigenPodImplementation.ethPOS() == IETHPOSDeposit(ETHPOSDepositAddress), "eigenPodImplementation: ethPOS not set correctly" ); diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 25c3cdb36..ad06d2eb9 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -207,6 +207,22 @@ contract EigenPod is // Process each checkpoint proof submitted for (uint256 i = 0; i < proofs.length; i++) { + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proofs[i].pubkeyHash]; + + // Validator must be in the ACTIVE state to be provable during a checkpoint. + // Validators become ACTIVE when initially proven via verifyWithdrawalCredentials + // Validators become WITHDRAWN when a checkpoint proof shows they have 0 balance + if (validatorInfo.status != VALIDATOR_STATUS.ACTIVE) { + continue; + } + + // Ensure we aren't proving a validator twice for the same checkpoint. This will fail if: + // - validator submitted twice during this checkpoint + // - validator withdrawal credentials verified after checkpoint starts, then submitted + // as a checkpoint proof + if (validatorInfo.mostRecentBalanceUpdateTimestamp < beaconTimestamp) { + continue; + } // Process a checkpoint proof for a validator. // - the validator MUST be in the ACTIVE state @@ -216,6 +232,7 @@ contract EigenPod is // The assumption is that if this is the case, any withdrawn ETH was already in // the pod when `startCheckpoint` was originally called. int256 balanceDeltaGwei = _verifyCheckpointProof({ + validatorInfo: validatorInfo, beaconTimestamp: beaconTimestamp, beaconStateRoot: stateRootProof.beaconStateRoot, proof: proofs[i] @@ -485,27 +502,12 @@ contract EigenPod is } function _verifyCheckpointProof( + ValidatorInfo memory validatorInfo, uint64 beaconTimestamp, bytes32 beaconStateRoot, BeaconChainProofs.BalanceProof calldata proof ) internal returns (int256 balanceDeltaGwei) { - ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proof.pubkeyHash]; uint40 validatorIndex = uint40(validatorInfo.validatorIndex); - - require( - validatorInfo.status == VALIDATOR_STATUS.ACTIVE, - "EigenPod._verifyCheckpointProof: validator must be ACTIVE" - ); - - // Ensure we aren't proving a validator twice for the same checkpoint. This will fail if: - // - validator submitted twice during this checkpoint - // - validator withdrawal credentials verified after checkpoint starts, then submitted - // as a checkpoint proof - // TODO - we might want to "skip" and emit an event, rather than revert? - require( - validatorInfo.mostRecentBalanceUpdateTimestamp < beaconTimestamp, - "EigenPod._verifyCheckpointProof: validator already proven for this checkpoint" - ); // Verify validator balance against beaconStateRoot uint64 prevBalanceGwei = validatorInfo.restakedBalanceGwei; diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index 408e5dcc7..1621566a6 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -420,77 +420,77 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return (timestamp - GOERLI_GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; } - // verifies that it is possible to subsequently prove WCs and withdraw funds when activateRestaking -> validator exit occur in the same epoch, in that order - // this is similar to `testProveWithdrawalCredentialsAfterValidatorExit` but somewhat more specific / targeted - function testEigenPodWithdrawalCredentialTimingSuccess() public { - // upgrade EigenPods to an implementation that has the genesis time to **one slot earlier** - // we do this so the validator exit at `GOERLI_GENESIS_TIME` is explicitly after genesis time, where we will active restaking - uint64 modifiedGenesisTime = GOERLI_GENESIS_TIME - 12; - podImplementation = new EigenPod( - ethPOSDeposit, - delayedWithdrawalRouter, - IEigenPodManager(podManagerAddress), - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, - modifiedGenesisTime - ); - eigenPodBeacon.upgradeTo(address(podImplementation)); + // // verifies that it is possible to subsequently prove WCs and withdraw funds when activateRestaking -> validator exit occur in the same epoch, in that order + // // this is similar to `testProveWithdrawalCredentialsAfterValidatorExit` but somewhat more specific / targeted + // function testEigenPodWithdrawalCredentialTimingSuccess() public { + // // upgrade EigenPods to an implementation that has the genesis time to **one slot earlier** + // // we do this so the validator exit at `GOERLI_GENESIS_TIME` is explicitly after genesis time, where we will active restaking + // uint64 modifiedGenesisTime = GOERLI_GENESIS_TIME - 12; + // podImplementation = new EigenPod( + // ethPOSDeposit, + // delayedWithdrawalRouter, + // IEigenPodManager(podManagerAddress), + // MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, + // modifiedGenesisTime + // ); + // eigenPodBeacon.upgradeTo(address(podImplementation)); - cheats.startPrank(podOwner); - IEigenPod newPod = IEigenPod(eigenPodManager.createPod()); - cheats.stopPrank(); + // cheats.startPrank(podOwner); + // IEigenPod newPod = IEigenPod(eigenPodManager.createPod()); + // cheats.stopPrank(); - //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 - cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); - require(newPod.hasRestaked() == false, "Pod should not be restaked"); + // //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 + // cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); + // require(newPod.hasRestaked() == false, "Pod should not be restaked"); - // move to slot at modifiedGenesisTime. this is within epoch 0, like the withdrawal - cheats.warp(modifiedGenesisTime); - cheats.prank(podOwner); - newPod.activateRestaking(); + // // move to slot at modifiedGenesisTime. this is within epoch 0, like the withdrawal + // cheats.warp(modifiedGenesisTime); + // cheats.prank(podOwner); + // newPod.activateRestaking(); - // warp forward to start of next epoch (epoch 1), so we can do WC proof with zero effective balance - cheats.warp(modifiedGenesisTime + BeaconChainProofs.SECONDS_PER_EPOCH); + // // warp forward to start of next epoch (epoch 1), so we can do WC proof with zero effective balance + // cheats.warp(modifiedGenesisTime + BeaconChainProofs.SECONDS_PER_EPOCH); - // get proof of validator 302913 having WCs pointed with 0 balance - // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); + // // get proof of validator 302913 having WCs pointed with 0 balance + // // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); + // bytes[] memory proofsArray = new bytes[](1); + // proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - //set the oracle block root - _setOracleBlockRoot(); + // //set the oracle block root + // _setOracleBlockRoot(); - int256 beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(podOwner); + // int256 beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(podOwner); - cheats.prank(podOwner); - newPod.verifyWithdrawalCredentials( - uint64(block.timestamp), - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); + // cheats.prank(podOwner); + // newPod.verifyWithdrawalCredentials( + // uint64(block.timestamp), + // stateRootProofStruct, + // validatorIndices, + // proofsArray, + // validatorFieldsArray + // ); - int256 beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(podOwner); - require(beaconChainETHSharesBefore == beaconChainETHSharesAfter, - "effectiveBalance should be zero, no shares should be credited"); + // int256 beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(podOwner); + // require(beaconChainETHSharesBefore == beaconChainETHSharesAfter, + // "effectiveBalance should be zero, no shares should be credited"); - //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false + // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json + // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json + // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - _proveWithdrawalForPod(newPod); - } + // _proveWithdrawalForPod(newPod); + // } // function testWithdrawNonBeaconChainETHBalanceWei() public { // IEigenPod pod = testDeployAndVerifyNewEigenPod(); From 21a58f7ac24a8fdef9fe5f9cd5fe0b872cccc4c0 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 21 May 2024 20:40:00 +0000 Subject: [PATCH 11/85] fix: swap inequality check to correctly skip duplicate proofs * chore: make bindings --- pkg/bindings/EigenPod/binding.go | 2 +- src/contracts/pods/EigenPod.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 601cbe363..23c85ebbf 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -67,7 +67,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"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\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"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\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b50604051620048d8380380620048d883398101604081905262000035916200014a565b6001600160a01b0380851660805283811660a052821660c0526001600160401b03811660e052620000656200006f565b50505050620001bd565b600054610100900460ff1615620000dc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156200012f576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014757600080fd5b50565b600080600080608085870312156200016157600080fd5b84516200016e8162000131565b6020860151909450620001818162000131565b6040860151909350620001948162000131565b60608601519092506001600160401b0381168114620001b257600080fd5b939692955090935050565b60805160a05160c05160e051614694620002446000396000610592015260008181610337015281816105cd0152818161098301528181610b4a01528181610e680152818161108301528181611179015281816114190152818161186101528181611a0a0152612dfc0152600061022f015260008181610444015261124401526146946000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063b522538a1161008a578063dda3346c11610064578063dda3346c14610520578063ee94d67c14610540578063f074ba6214610560578063f28824611461058057600080fd5b8063b522538a146104c0578063c4907442146104e0578063c4d66de81461050057600080fd5b80636fcd0e53146103ce5780637439841f146103fb57806374cdd7981461043257806387e0d2891461046657806388676cad1461048d5780639b4e4634146104ad57600080fd5b80633474aa16116101235780633474aa16146102a65780633f65cf19146102de57806342ecff2a146102fe5780634665bcda1461032557806347d283721461035957806358eaee79146103a157600080fd5b8063039157d2146101a95780630b18ff66146101cb5780630cd4649e146102085780631a5057be1461021d5780632340e8d3146102515780633106ab531461027557600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c43660046138fc565b6105b4565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b506101c961096a565b34801561022957600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025d57600080fd5b5061026760395481565b6040519081526020016101ff565b34801561028157600080fd5b5060345461029690600160401b900460ff1681565b60405190151581526020016101ff565b3480156102b257600080fd5b506034546102c6906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b3480156102ea57600080fd5b506101c96102f93660046139ba565b610b07565b34801561030a57600080fd5b50603a546102c690600160401b90046001600160401b031681565b34801561033157600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036557600080fd5b5061036e610ed3565b6040516101ff91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b3480156103ad57600080fd5b506103c16103bc366004613ac9565b610f2e565b6040516101ff9190613b42565b3480156103da57600080fd5b506103ee6103e9366004613b50565b610f93565b6040516101ff9190613b69565b34801561040757600080fd5b506103c1610416366004613b50565b600090815260366020526040902054600160c01b900460ff1690565b34801561043e57600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506033546102c690600160a01b90046001600160401b031681565b34801561049957600080fd5b506101c96104a8366004613bbf565b611040565b6101c96104bb366004613bdc565b61116e565b3480156104cc57600080fd5b506103ee6104db366004613ac9565b61131b565b3480156104ec57600080fd5b506101c96104fb366004613c6f565b61140e565b34801561050c57600080fd5b506101c961051b366004613c9b565b611646565b34801561052c57600080fd5b506101c961053b366004613d8c565b61181e565b34801561054c57600080fd5b50603a546102c6906001600160401b031681565b34801561056c57600080fd5b506101c961057b366004613e5d565b6119f1565b34801561058c57600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190613ec5565b156106665760405162461bcd60e51b815260040161065d90613ee2565b60405180910390fd5b60006106ac6106758480613f3f565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0692505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561071b5761071b613b0a565b600281111561072c5761072c613b0a565b8152505090506212750081604001516001600160401b031661074e9190613f9e565b866001600160401b0316116107cb5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c652079657400606482015260840161065d565b6001816060015160028111156107e3576107e3613b0a565b1461084d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b606482015260840161065d565b61089161085a8580613f3f565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2a92505050565b6109155760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a40161065d565b61093561092187611d54565b86356109306020890189613fb6565b611f0a565b61095885356109448680613f3f565b6109516020890189613fb6565b8651612098565b61096260006122b9565b505050505050565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613ec5565b15610a135760405162461bcd60e51b815260040161065d90613ee2565b6033546001600160a01b03163314610a3d5760405162461bcd60e51b815260040161065d90613ffc565b603454600160401b900460ff1615610aaf5760405162461bcd60e51b815260206004820152602f60248201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160448201526e1ada5b99c81a5cc8195b98589b1959608a1b606482015260840161065d565b6034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2610b0460006122b9565b50565b6033546001600160a01b03163314610b315760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd9190613ec5565b15610bda5760405162461bcd60e51b815260040161065d90613ee2565b6034548990600160401b900460ff168015610c0b57506033546001600160401b03600160a01b909104811690821610155b610c275760405162461bcd60e51b815260040161065d90614044565b8685148015610c3557508483145b610cc55760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161065d565b603a546001600160401b03908116908b16118015610cf85750603a546001600160401b03600160401b9091048116908b16115b610d7f5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161065d565b610d9a610d8b8b611d54565b8a3561093060208d018d613fb6565b6000805b88811015610e3e57610e208c8c358c8c85818110610dbe57610dbe6140b8565b9050602002016020810190610dd391906140ce565b8b8b86818110610de557610de56140b8565b9050602002810190610df79190613fb6565b8b8b88818110610e0957610e096140b8565b9050602002810190610e1b9190613f3f565b6124a0565b610e2a9083613f9e565b915080610e36816140f5565b915050610d9e565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610eae57600080fd5b505af1158015610ec2573d6000803e3d6000fd5b505050505050505050505050505050565b610f016040518060800160405280600080191681526020016000815260200160008152602001600081525090565b5060408051608081018252603b548152603c546020820152603d5491810191909152603e54606082015290565b600080610f7084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299992505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610fbb6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561102657611026613b0a565b600281111561103757611037613b0a565b90525092915050565b6033546001600160a01b0316331461106a5760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190613ec5565b156111135760405162461bcd60e51b815260040161065d90613ee2565b6034544290600160401b900460ff16801561114457506033546001600160401b03600160a01b909104811690821610155b6111605760405162461bcd60e51b815260040161065d90614044565b611169836122b9565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b65760405162461bcd60e51b815260040161065d90614110565b346801bc16d674ec800000146112425760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161065d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611285612a93565b8888886040518863ffffffff1660e01b81526004016112a9969594939291906141e2565b6000604051808303818588803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161130c929190614231565b60405180910390a15050505050565b6113436040805160808101825260008082526020820181905291810182905290606082015290565b6036600061138685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299992505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113f3576113f3613b0a565b600281111561140457611404613b0a565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114565760405162461bcd60e51b815260040161065d90614110565b611464633b9aca008261425b565b156114ee5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161065d565b60006114fe633b9aca008361426f565b6034549091506001600160401b0390811690821611156115b75760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c40161065d565b603480548291906000906115d59084906001600160401b0316614283565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161163491815260200190565b60405180910390a26111698383612ad8565b600054610100900460ff16158080156116665750600054600160ff909116105b806116805750303b158015611680575060005460ff166001145b6116e35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065d565b6000805460ff191660011790558015611706576000805461ff0019166101001790555b6001600160a01b0382166117795760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161065d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118485760405162461bcd60e51b815260040161065d90613ffc565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190613ec5565b156118f15760405162461bcd60e51b815260040161065d90613ee2565b825184511461197c5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161065d565b60005b84518110156119ea576119d88385838151811061199e5761199e6140b8565b60200260200101518784815181106119b8576119b86140b8565b60200260200101516001600160a01b0316612ae29092919063ffffffff16565b806119e2816140f5565b91505061197f565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190613ec5565b15611a9a5760405162461bcd60e51b815260040161065d90613ee2565b603a54600160401b90046001600160401b031680611b465760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a40161065d565b60408051608081018252603b54808252603c54602080840191909152603d5493830193909352603e5460608301529091611b8a9190883590610930908a018a613fb6565b60005b84811015611cfc57600060366000888885818110611bad57611bad6140b8565b9050602002810190611bbf91906142ab565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611c2d57611c2d613b0a565b6002811115611c3e57611c3e613b0a565b9052509050600181606001516002811115611c5b57611c5b613b0a565b14611c665750611cea565b836001600160401b031681604001516001600160401b03161015611c8a5750611cea565b6000611cbc82868b358b8b88818110611ca557611ca56140b8565b9050602002810190611cb791906142ab565b612b34565b606085018051919250611cce826142cb565b815250508084604001818151611ce491906142e2565b90525050505b80611cf4816140f5565b915050611b8d565b5061096281612d2b565b600081600081518110611d1b57611d1b6140b8565b60200260200101519050919050565b600081600381518110611d3f57611d3f6140b8565b60200260200101516000801b14159050919050565b6000611d63611fff600c614323565b611d766001600160401b03841642614342565b10611de05760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b606482015260840161065d565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e2891614359565b600060405180830381855afa9150503d8060008114611e63576040519150601f19603f3d011682016040523d82523d6000602084013e611e68565b606091505b5091509150818015611e7b575060008151115b15611e9c5780806020019051810190611e94919061436b565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e656400000000000000606482015260840161065d565b611f1660036020614323565b8114611fa65760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161065d565b611feb82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612ebe565b6120925760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161065d565b50505050565b6120a460036002614468565b841461211d5760405162461bcd60e51b815260206004820152604e602482015260008051602061463f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161065d565b600561212b60286001613f9e565b6121359190613f9e565b612140906020614323565b82146121ae5760405162461bcd60e51b8152602060048201526043602482015260008051602061463f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161065d565b600064ffffffffff82166121c460286001613f9e565b600b901b1790506000612209878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ed692505050565b905061224f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612ebe565b6122af5760405162461bcd60e51b815260206004820152603d602482015260008051602061463f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161065d565b5050505050505050565b603a54600160401b90046001600160401b03161561235a5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a40161065d565b6034546000906001600160401b0316612377633b9aca004761426f565b6123819190614342565b905081801561238e575080155b156124015760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e74000000606482015260840161065d565b6000604051806080016040528061241742611d54565b81526020810184905260006040820152603954606090910152603a80546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055905061246581612d2b565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124df848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0692505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561254e5761254e613b0a565b600281111561255f5761255f613b0a565b905250905060008160600151600281111561257c5761257c613b0a565b1461261f5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c40161065d565b6001600160401b03801661266586868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318392505050565b6001600160401b0316146126ef5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a40161065d565b6126f7612a93565b61270090614474565b61273c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131a892505050565b146127bd5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a40161065d565b60006127fb8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131bd92505050565b905061280b8a87878b8b8e612098565b6039805490600061281b836140f5565b9091555060019050606083018190525064ffffffffff891682526001600160401b038b811660408085019182528383166020808701918252600088815260369091529190912085518154925193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b0319909416919095161791909117918216831781556060850151859391929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156128e2576128e2613b0a565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8b1681526001600160401b038d8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a161298a633b9aca006001600160401b038316614323565b9b9a5050505050505050505050565b60008151603014612a225760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a40161065d565b604051600290612a39908490600090602001614498565b60408051601f1981840301815290829052612a5391614359565b602060405180830381855afa158015612a70573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8d919061436b565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61181a82826131d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111699084906132ee565b835160208501516000919082612b4b8684876133c0565b6001600160401b0380821660208b0181905290891660408b0152909150612bc65760398054906000612b7c836142cb565b90915550506002606089015260405164ffffffffff8416906001600160401b038916907f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a90600090a35b84356000908152603660209081526040918290208a518154928c0151938c01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608b01518b9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612c6657612c66613b0a565b02179055505060405164ffffffffff851691506001600160401b038916907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3816001600160401b0316816001600160401b031614612d20576040805164ffffffffff851681526001600160401b03898116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612d1d8183613557565b93505b505050949350505050565b6060810151612ea0576000633b9aca0082604001518360200151612d4f91906142e2565b612d5991906144c7565b6020830151603480549293509091600090612d7e9084906001600160401b031661454c565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603b819055603c819055603d819055603e5560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612e4257600080fd5b505af1158015612e56573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603b556020810151603c556040810151603d5560600151603e55565b600083612ecc86858561356f565b1495945050505050565b60008060028351612ee7919061426f565b90506000816001600160401b03811115612f0357612f03613cb8565b604051908082528060200260200182016040528015612f2c578160200160208202803683370190505b50905060005b8281101561303357600285612f478383614323565b81518110612f5757612f576140b8565b602002602001015186836002612f6d9190614323565b612f78906001613f9e565b81518110612f8857612f886140b8565b6020026020010151604051602001612faa929190918252602082015260400190565b60408051601f1981840301815290829052612fc491614359565b602060405180830381855afa158015612fe1573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190613004919061436b565b828281518110613016576130166140b8565b60209081029190910101528061302b816140f5565b915050612f32565b5061303f60028361426f565b91505b811561315f5760005b8281101561314c576002826130608383614323565b81518110613070576130706140b8565b6020026020010151838360026130869190614323565b613091906001613f9e565b815181106130a1576130a16140b8565b60200260200101516040516020016130c3929190918252602082015260400190565b60408051601f19818403018152908290526130dd91614359565b602060405180830381855afa1580156130fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061311d919061436b565b82828151811061312f5761312f6140b8565b602090810291909101015280613144816140f5565b91505061304b565b5061315860028361426f565b9150613042565b80600081518110613172576131726140b8565b602002602001015192505050919050565b6000610f8d8260068151811061319b5761319b6140b8565b60200260200101516136bb565b600081600181518110611d1b57611d1b6140b8565b6000610f8d8260028151811061319b5761319b6140b8565b804710156132255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161065d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613272576040519150601f19603f3d011682016040523d82523d6000602084013e613277565b606091505b50509050806111695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161065d565b6000613343826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137229092919063ffffffff16565b80519091501561116957808060200190518101906133619190613ec5565b6111695760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065d565b600060056133d060266001613f9e565b6133da9190613f9e565b6133e5906020614323565b6133f26040840184613fb6565b9050146134635760405162461bcd60e51b81526020600482015260446024820181905260008051602061463f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161065d565b6000613470600485614577565b64ffffffffff1690508061348660266001613f9e565b600c901b1790506134de61349d6040850185613fb6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992505050602086013584612ebe565b61353e5760405162461bcd60e51b815260206004820152603e602482015260008051602061463f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161065d565b61354c836020013585613731565b9150505b9392505050565b60006135506001600160401b0380841690851661459b565b6000835160001415801561358e57506020845161358c919061425b565b155b61361d5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161065d565b604080516020808201909252848152905b855181116136b15761364160028561425b565b613674578151600052808601516020526020826040600060026107d05a03fa61366957600080fd5b60028404935061369f565b8086015160005281516020526020826040600060026107d05a03fa61369857600080fd5b6002840493505b6136aa602082613f9e565b905061362e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e94848460008561375e565b60008061373f6004846145da565b61374a9060406145fe565b64ffffffffff169050611e9484821b6136bb565b6060824710156137bf5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161065d565b6001600160a01b0385163b6138165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065d565b600080866001600160a01b031685876040516138329190614359565b60006040518083038185875af1925050503d806000811461386f576040519150601f19603f3d011682016040523d82523d6000602084013e613874565b606091505b509150915061388482828661388f565b979650505050505050565b6060831561389e575081613550565b8251156138ae5782518084602001fd5b8160405162461bcd60e51b815260040161065d919061462b565b80356001600160401b03811681146138df57600080fd5b919050565b6000604082840312156138f657600080fd5b50919050565b60008060006060848603121561391157600080fd5b61391a846138c8565b925060208401356001600160401b038082111561393657600080fd5b613942878388016138e4565b9350604086013591508082111561395857600080fd5b50613965868287016138e4565b9150509250925092565b60008083601f84011261398157600080fd5b5081356001600160401b0381111561399857600080fd5b6020830191508360208260051b85010111156139b357600080fd5b9250929050565b60008060008060008060008060a0898b0312156139d657600080fd5b6139df896138c8565b975060208901356001600160401b03808211156139fb57600080fd5b613a078c838d016138e4565b985060408b0135915080821115613a1d57600080fd5b613a298c838d0161396f565b909850965060608b0135915080821115613a4257600080fd5b613a4e8c838d0161396f565b909650945060808b0135915080821115613a6757600080fd5b50613a748b828c0161396f565b999c989b5096995094979396929594505050565b60008083601f840112613a9a57600080fd5b5081356001600160401b03811115613ab157600080fd5b6020830191508360208285010111156139b357600080fd5b60008060208385031215613adc57600080fd5b82356001600160401b03811115613af257600080fd5b613afe85828601613a88565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613b3e57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610f8d8284613b20565b600060208284031215613b6257600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613baa6060840182613b20565b5092915050565b8015158114610b0457600080fd5b600060208284031215613bd157600080fd5b813561355081613bb1565b600080600080600060608688031215613bf457600080fd5b85356001600160401b0380821115613c0b57600080fd5b613c1789838a01613a88565b90975095506020880135915080821115613c3057600080fd5b50613c3d88828901613a88565b96999598509660400135949350505050565b6001600160a01b0381168114610b0457600080fd5b80356138df81613c4f565b60008060408385031215613c8257600080fd5b8235613c8d81613c4f565b946020939093013593505050565b600060208284031215613cad57600080fd5b813561355081613c4f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cf657613cf6613cb8565b604052919050565b60006001600160401b03821115613d1757613d17613cb8565b5060051b60200190565b600082601f830112613d3257600080fd5b81356020613d47613d4283613cfe565b613cce565b82815260059290921b84018101918181019086841115613d6657600080fd5b8286015b84811015613d815780358352918301918301613d6a565b509695505050505050565b600080600060608486031215613da157600080fd5b83356001600160401b0380821115613db857600080fd5b818601915086601f830112613dcc57600080fd5b81356020613ddc613d4283613cfe565b82815260059290921b8401810191818101908a841115613dfb57600080fd5b948201945b83861015613e22578535613e1381613c4f565b82529482019490820190613e00565b97505087013592505080821115613e3857600080fd5b50613e4586828701613d21565b925050613e5460408501613c64565b90509250925092565b600080600060408486031215613e7257600080fd5b83356001600160401b0380821115613e8957600080fd5b613e95878388016138e4565b94506020860135915080821115613eab57600080fd5b50613eb88682870161396f565b9497909650939450505050565b600060208284031215613ed757600080fd5b815161355081613bb1565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e19843603018112613f5657600080fd5b8301803591506001600160401b03821115613f7057600080fd5b6020019150600581901b36038213156139b357600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613fb157613fb1613f88565b500190565b6000808335601e19843603018112613fcd57600080fd5b8301803591506001600160401b03821115613fe757600080fd5b6020019150368190038213156139b357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252604e908201527f456967656e506f642e616674657252657374616b696e673a2074696d6573746160408201527f6d70206d757374206265206174206f722061667465722072657374616b696e6760608201526d081dd85cc81858dd1a5d985d195960921b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156140e057600080fd5b813564ffffffffff8116811461355057600080fd5b600060001982141561410957614109613f88565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156141a557818101518382015260200161418d565b838111156120925750506000910152565b600081518084526141ce81602086016020860161418a565b601f01601f19169290920160200192915050565b6080815260006141f660808301888a614161565b828103602084015261420881886141b6565b9050828103604084015261421d818688614161565b915050826060830152979650505050505050565b602081526000611e94602083018486614161565b634e487b7160e01b600052601260045260246000fd5b60008261426a5761426a614245565b500690565b60008261427e5761427e614245565b500490565b60006001600160401b03838116908316818110156142a3576142a3613f88565b039392505050565b60008235605e198336030181126142c157600080fd5b9190910192915050565b6000816142da576142da613f88565b506000190190565b600080821280156001600160ff1b038490038513161561430457614304613f88565b600160ff1b839003841281161561431d5761431d613f88565b50500190565b600081600019048311821515161561433d5761433d613f88565b500290565b60008282101561435457614354613f88565b500390565b600082516142c181846020870161418a565b60006020828403121561437d57600080fd5b5051919050565b600181815b808511156143bf5781600019048211156143a5576143a5613f88565b808516156143b257918102915b93841c9390800290614389565b509250929050565b6000826143d657506001610f8d565b816143e357506000610f8d565b81600181146143f957600281146144035761441f565b6001915050610f8d565b60ff84111561441457614414613f88565b50506001821b610f8d565b5060208310610133831016604e8410600b8410161715614442575081810a610f8d565b61444c8383614384565b806000190482111561446057614460613f88565b029392505050565b600061355083836143c7565b805160208083015191908110156138f65760001960209190910360031b1b16919050565b600083516144aa81846020880161418a565b6001600160801b0319939093169190920190815260100192915050565b60006001600160ff1b03818413828413808216868404861116156144ed576144ed613f88565b600160ff1b600087128281168783058912161561450c5761450c613f88565b6000871292508782058712848416161561452857614528613f88565b8785058712818416161561453e5761453e613f88565b505050929093029392505050565b60006001600160401b0380831681851680830382111561456e5761456e613f88565b01949350505050565b600064ffffffffff8084168061458f5761458f614245565b92169190910492915050565b60008083128015600160ff1b8501841216156145b9576145b9613f88565b6001600160ff1b03840183138116156145d4576145d4613f88565b50500390565b600064ffffffffff808416806145f2576145f2614245565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561462257614622613f88565b02949350505050565b60208152600061355060208301846141b656fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220bdd63a4b0a3fad7679855765d39fc608c8e09d9d5ad9ef81e6213b969b0ff93464736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b50604051620048d7380380620048d783398101604081905262000035916200014a565b6001600160a01b0380851660805283811660a052821660c0526001600160401b03811660e052620000656200006f565b50505050620001bd565b600054610100900460ff1615620000dc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156200012f576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014757600080fd5b50565b600080600080608085870312156200016157600080fd5b84516200016e8162000131565b6020860151909450620001818162000131565b6040860151909350620001948162000131565b60608601519092506001600160401b0381168114620001b257600080fd5b939692955090935050565b60805160a05160c05160e051614693620002446000396000610592015260008181610337015281816105cd0152818161098301528181610b4a01528181610e680152818161108301528181611179015281816114190152818161186101528181611a0a0152612dfb0152600061022f015260008181610444015261124401526146936000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063b522538a1161008a578063dda3346c11610064578063dda3346c14610520578063ee94d67c14610540578063f074ba6214610560578063f28824611461058057600080fd5b8063b522538a146104c0578063c4907442146104e0578063c4d66de81461050057600080fd5b80636fcd0e53146103ce5780637439841f146103fb57806374cdd7981461043257806387e0d2891461046657806388676cad1461048d5780639b4e4634146104ad57600080fd5b80633474aa16116101235780633474aa16146102a65780633f65cf19146102de57806342ecff2a146102fe5780634665bcda1461032557806347d283721461035957806358eaee79146103a157600080fd5b8063039157d2146101a95780630b18ff66146101cb5780630cd4649e146102085780631a5057be1461021d5780632340e8d3146102515780633106ab531461027557600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c43660046138fb565b6105b4565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b506101c961096a565b34801561022957600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025d57600080fd5b5061026760395481565b6040519081526020016101ff565b34801561028157600080fd5b5060345461029690600160401b900460ff1681565b60405190151581526020016101ff565b3480156102b257600080fd5b506034546102c6906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b3480156102ea57600080fd5b506101c96102f93660046139b9565b610b07565b34801561030a57600080fd5b50603a546102c690600160401b90046001600160401b031681565b34801561033157600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036557600080fd5b5061036e610ed3565b6040516101ff91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b3480156103ad57600080fd5b506103c16103bc366004613ac8565b610f2e565b6040516101ff9190613b41565b3480156103da57600080fd5b506103ee6103e9366004613b4f565b610f93565b6040516101ff9190613b68565b34801561040757600080fd5b506103c1610416366004613b4f565b600090815260366020526040902054600160c01b900460ff1690565b34801561043e57600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506033546102c690600160a01b90046001600160401b031681565b34801561049957600080fd5b506101c96104a8366004613bbe565b611040565b6101c96104bb366004613bdb565b61116e565b3480156104cc57600080fd5b506103ee6104db366004613ac8565b61131b565b3480156104ec57600080fd5b506101c96104fb366004613c6e565b61140e565b34801561050c57600080fd5b506101c961051b366004613c9a565b611646565b34801561052c57600080fd5b506101c961053b366004613d8b565b61181e565b34801561054c57600080fd5b50603a546102c6906001600160401b031681565b34801561056c57600080fd5b506101c961057b366004613e5c565b6119f1565b34801561058c57600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190613ec4565b156106665760405162461bcd60e51b815260040161065d90613ee1565b60405180910390fd5b60006106ac6106758480613f3e565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0592505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561071b5761071b613b09565b600281111561072c5761072c613b09565b8152505090506212750081604001516001600160401b031661074e9190613f9d565b866001600160401b0316116107cb5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c652079657400606482015260840161065d565b6001816060015160028111156107e3576107e3613b09565b1461084d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b606482015260840161065d565b61089161085a8580613f3e565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2992505050565b6109155760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a40161065d565b61093561092187611d53565b86356109306020890189613fb5565b611f09565b61095885356109448680613f3e565b6109516020890189613fb5565b8651612097565b61096260006122b8565b505050505050565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613ec4565b15610a135760405162461bcd60e51b815260040161065d90613ee1565b6033546001600160a01b03163314610a3d5760405162461bcd60e51b815260040161065d90613ffb565b603454600160401b900460ff1615610aaf5760405162461bcd60e51b815260206004820152602f60248201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160448201526e1ada5b99c81a5cc8195b98589b1959608a1b606482015260840161065d565b6034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2610b0460006122b8565b50565b6033546001600160a01b03163314610b315760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd9190613ec4565b15610bda5760405162461bcd60e51b815260040161065d90613ee1565b6034548990600160401b900460ff168015610c0b57506033546001600160401b03600160a01b909104811690821610155b610c275760405162461bcd60e51b815260040161065d90614043565b8685148015610c3557508483145b610cc55760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161065d565b603a546001600160401b03908116908b16118015610cf85750603a546001600160401b03600160401b9091048116908b16115b610d7f5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161065d565b610d9a610d8b8b611d53565b8a3561093060208d018d613fb5565b6000805b88811015610e3e57610e208c8c358c8c85818110610dbe57610dbe6140b7565b9050602002016020810190610dd391906140cd565b8b8b86818110610de557610de56140b7565b9050602002810190610df79190613fb5565b8b8b88818110610e0957610e096140b7565b9050602002810190610e1b9190613f3e565b61249f565b610e2a9083613f9d565b915080610e36816140f4565b915050610d9e565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610eae57600080fd5b505af1158015610ec2573d6000803e3d6000fd5b505050505050505050505050505050565b610f016040518060800160405280600080191681526020016000815260200160008152602001600081525090565b5060408051608081018252603b548152603c546020820152603d5491810191909152603e54606082015290565b600080610f7084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610fbb6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561102657611026613b09565b600281111561103757611037613b09565b90525092915050565b6033546001600160a01b0316331461106a5760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190613ec4565b156111135760405162461bcd60e51b815260040161065d90613ee1565b6034544290600160401b900460ff16801561114457506033546001600160401b03600160a01b909104811690821610155b6111605760405162461bcd60e51b815260040161065d90614043565b611169836122b8565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b65760405162461bcd60e51b815260040161065d9061410f565b346801bc16d674ec800000146112425760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161065d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611285612a92565b8888886040518863ffffffff1660e01b81526004016112a9969594939291906141e1565b6000604051808303818588803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161130c929190614230565b60405180910390a15050505050565b6113436040805160808101825260008082526020820181905291810182905290606082015290565b6036600061138685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113f3576113f3613b09565b600281111561140457611404613b09565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114565760405162461bcd60e51b815260040161065d9061410f565b611464633b9aca008261425a565b156114ee5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161065d565b60006114fe633b9aca008361426e565b6034549091506001600160401b0390811690821611156115b75760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c40161065d565b603480548291906000906115d59084906001600160401b0316614282565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161163491815260200190565b60405180910390a26111698383612ad7565b600054610100900460ff16158080156116665750600054600160ff909116105b806116805750303b158015611680575060005460ff166001145b6116e35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065d565b6000805460ff191660011790558015611706576000805461ff0019166101001790555b6001600160a01b0382166117795760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161065d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118485760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190613ec4565b156118f15760405162461bcd60e51b815260040161065d90613ee1565b825184511461197c5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161065d565b60005b84518110156119ea576119d88385838151811061199e5761199e6140b7565b60200260200101518784815181106119b8576119b86140b7565b60200260200101516001600160a01b0316612ae19092919063ffffffff16565b806119e2816140f4565b91505061197f565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190613ec4565b15611a9a5760405162461bcd60e51b815260040161065d90613ee1565b603a54600160401b90046001600160401b031680611b465760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a40161065d565b60408051608081018252603b54808252603c54602080840191909152603d5493830193909352603e5460608301529091611b8a9190883590610930908a018a613fb5565b60005b84811015611cfb57600060366000888885818110611bad57611bad6140b7565b9050602002810190611bbf91906142aa565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611c2d57611c2d613b09565b6002811115611c3e57611c3e613b09565b9052509050600181606001516002811115611c5b57611c5b613b09565b14611c665750611ce9565b836001600160401b031681604001516001600160401b031610611c895750611ce9565b6000611cbb82868b358b8b88818110611ca457611ca46140b7565b9050602002810190611cb691906142aa565b612b33565b606085018051919250611ccd826142ca565b815250508084604001818151611ce391906142e1565b90525050505b80611cf3816140f4565b915050611b8d565b5061096281612d2a565b600081600081518110611d1a57611d1a6140b7565b60200260200101519050919050565b600081600381518110611d3e57611d3e6140b7565b60200260200101516000801b14159050919050565b6000611d62611fff600c614322565b611d756001600160401b03841642614341565b10611ddf5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b606482015260840161065d565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e2791614358565b600060405180830381855afa9150503d8060008114611e62576040519150601f19603f3d011682016040523d82523d6000602084013e611e67565b606091505b5091509150818015611e7a575060008151115b15611e9b5780806020019051810190611e93919061436a565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e656400000000000000606482015260840161065d565b611f1560036020614322565b8114611fa55760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161065d565b611fea82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612ebd565b6120915760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161065d565b50505050565b6120a360036002614467565b841461211c5760405162461bcd60e51b815260206004820152604e602482015260008051602061463e83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161065d565b600561212a60286001613f9d565b6121349190613f9d565b61213f906020614322565b82146121ad5760405162461bcd60e51b8152602060048201526043602482015260008051602061463e83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161065d565b600064ffffffffff82166121c360286001613f9d565b600b901b1790506000612208878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ed592505050565b905061224e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612ebd565b6122ae5760405162461bcd60e51b815260206004820152603d602482015260008051602061463e83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161065d565b5050505050505050565b603a54600160401b90046001600160401b0316156123595760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a40161065d565b6034546000906001600160401b0316612376633b9aca004761426e565b6123809190614341565b905081801561238d575080155b156124005760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e74000000606482015260840161065d565b6000604051806080016040528061241642611d53565b81526020810184905260006040820152603954606090910152603a80546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055905061246481612d2a565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124de848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0592505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561254d5761254d613b09565b600281111561255e5761255e613b09565b905250905060008160600151600281111561257b5761257b613b09565b1461261e5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c40161065d565b6001600160401b03801661266486868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318292505050565b6001600160401b0316146126ee5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a40161065d565b6126f6612a92565b6126ff90614473565b61273b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131a792505050565b146127bc5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a40161065d565b60006127fa8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131bc92505050565b905061280a8a87878b8b8e612097565b6039805490600061281a836140f4565b9091555060019050606083018190525064ffffffffff891682526001600160401b038b811660408085019182528383166020808701918252600088815260369091529190912085518154925193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b0319909416919095161791909117918216831781556060850151859391929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156128e1576128e1613b09565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8b1681526001600160401b038d8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612989633b9aca006001600160401b038316614322565b9b9a5050505050505050505050565b60008151603014612a215760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a40161065d565b604051600290612a38908490600090602001614497565b60408051601f1981840301815290829052612a5291614358565b602060405180830381855afa158015612a6f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8d919061436a565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61181a82826131d4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111699084906132ed565b835160208501516000919082612b4a8684876133bf565b6001600160401b0380821660208b0181905290891660408b0152909150612bc55760398054906000612b7b836142ca565b90915550506002606089015260405164ffffffffff8416906001600160401b038916907f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a90600090a35b84356000908152603660209081526040918290208a518154928c0151938c01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608b01518b9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612c6557612c65613b09565b02179055505060405164ffffffffff851691506001600160401b038916907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3816001600160401b0316816001600160401b031614612d1f576040805164ffffffffff851681526001600160401b03898116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612d1c8183613556565b93505b505050949350505050565b6060810151612e9f576000633b9aca0082604001518360200151612d4e91906142e1565b612d5891906144c6565b6020830151603480549293509091600090612d7d9084906001600160401b031661454b565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603b819055603c819055603d819055603e5560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603b556020810151603c556040810151603d5560600151603e55565b600083612ecb86858561356e565b1495945050505050565b60008060028351612ee6919061426e565b90506000816001600160401b03811115612f0257612f02613cb7565b604051908082528060200260200182016040528015612f2b578160200160208202803683370190505b50905060005b8281101561303257600285612f468383614322565b81518110612f5657612f566140b7565b602002602001015186836002612f6c9190614322565b612f77906001613f9d565b81518110612f8757612f876140b7565b6020026020010151604051602001612fa9929190918252602082015260400190565b60408051601f1981840301815290829052612fc391614358565b602060405180830381855afa158015612fe0573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190613003919061436a565b828281518110613015576130156140b7565b60209081029190910101528061302a816140f4565b915050612f31565b5061303e60028361426e565b91505b811561315e5760005b8281101561314b5760028261305f8383614322565b8151811061306f5761306f6140b7565b6020026020010151838360026130859190614322565b613090906001613f9d565b815181106130a0576130a06140b7565b60200260200101516040516020016130c2929190918252602082015260400190565b60408051601f19818403018152908290526130dc91614358565b602060405180830381855afa1580156130f9573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061311c919061436a565b82828151811061312e5761312e6140b7565b602090810291909101015280613143816140f4565b91505061304a565b5061315760028361426e565b9150613041565b80600081518110613171576131716140b7565b602002602001015192505050919050565b6000610f8d8260068151811061319a5761319a6140b7565b60200260200101516136ba565b600081600181518110611d1a57611d1a6140b7565b6000610f8d8260028151811061319a5761319a6140b7565b804710156132245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161065d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613271576040519150601f19603f3d011682016040523d82523d6000602084013e613276565b606091505b50509050806111695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161065d565b6000613342826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137219092919063ffffffff16565b80519091501561116957808060200190518101906133609190613ec4565b6111695760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065d565b600060056133cf60266001613f9d565b6133d99190613f9d565b6133e4906020614322565b6133f16040840184613fb5565b9050146134625760405162461bcd60e51b81526020600482015260446024820181905260008051602061463e833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161065d565b600061346f600485614576565b64ffffffffff1690508061348560266001613f9d565b600c901b1790506134dd61349c6040850185613fb5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992505050602086013584612ebd565b61353d5760405162461bcd60e51b815260206004820152603e602482015260008051602061463e83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161065d565b61354b836020013585613730565b9150505b9392505050565b600061354f6001600160401b0380841690851661459a565b6000835160001415801561358d57506020845161358b919061425a565b155b61361c5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161065d565b604080516020808201909252848152905b855181116136b05761364060028561425a565b613673578151600052808601516020526020826040600060026107d05a03fa61366857600080fd5b60028404935061369e565b8086015160005281516020526020826040600060026107d05a03fa61369757600080fd5b6002840493505b6136a9602082613f9d565b905061362d565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e93848460008561375d565b60008061373e6004846145d9565b6137499060406145fd565b64ffffffffff169050611e9384821b6136ba565b6060824710156137be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161065d565b6001600160a01b0385163b6138155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065d565b600080866001600160a01b031685876040516138319190614358565b60006040518083038185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b509150915061388382828661388e565b979650505050505050565b6060831561389d57508161354f565b8251156138ad5782518084602001fd5b8160405162461bcd60e51b815260040161065d919061462a565b80356001600160401b03811681146138de57600080fd5b919050565b6000604082840312156138f557600080fd5b50919050565b60008060006060848603121561391057600080fd5b613919846138c7565b925060208401356001600160401b038082111561393557600080fd5b613941878388016138e3565b9350604086013591508082111561395757600080fd5b50613964868287016138e3565b9150509250925092565b60008083601f84011261398057600080fd5b5081356001600160401b0381111561399757600080fd5b6020830191508360208260051b85010111156139b257600080fd5b9250929050565b60008060008060008060008060a0898b0312156139d557600080fd5b6139de896138c7565b975060208901356001600160401b03808211156139fa57600080fd5b613a068c838d016138e3565b985060408b0135915080821115613a1c57600080fd5b613a288c838d0161396e565b909850965060608b0135915080821115613a4157600080fd5b613a4d8c838d0161396e565b909650945060808b0135915080821115613a6657600080fd5b50613a738b828c0161396e565b999c989b5096995094979396929594505050565b60008083601f840112613a9957600080fd5b5081356001600160401b03811115613ab057600080fd5b6020830191508360208285010111156139b257600080fd5b60008060208385031215613adb57600080fd5b82356001600160401b03811115613af157600080fd5b613afd85828601613a87565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613b3d57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610f8d8284613b1f565b600060208284031215613b6157600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613ba96060840182613b1f565b5092915050565b8015158114610b0457600080fd5b600060208284031215613bd057600080fd5b813561354f81613bb0565b600080600080600060608688031215613bf357600080fd5b85356001600160401b0380821115613c0a57600080fd5b613c1689838a01613a87565b90975095506020880135915080821115613c2f57600080fd5b50613c3c88828901613a87565b96999598509660400135949350505050565b6001600160a01b0381168114610b0457600080fd5b80356138de81613c4e565b60008060408385031215613c8157600080fd5b8235613c8c81613c4e565b946020939093013593505050565b600060208284031215613cac57600080fd5b813561354f81613c4e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cf557613cf5613cb7565b604052919050565b60006001600160401b03821115613d1657613d16613cb7565b5060051b60200190565b600082601f830112613d3157600080fd5b81356020613d46613d4183613cfd565b613ccd565b82815260059290921b84018101918181019086841115613d6557600080fd5b8286015b84811015613d805780358352918301918301613d69565b509695505050505050565b600080600060608486031215613da057600080fd5b83356001600160401b0380821115613db757600080fd5b818601915086601f830112613dcb57600080fd5b81356020613ddb613d4183613cfd565b82815260059290921b8401810191818101908a841115613dfa57600080fd5b948201945b83861015613e21578535613e1281613c4e565b82529482019490820190613dff565b97505087013592505080821115613e3757600080fd5b50613e4486828701613d20565b925050613e5360408501613c63565b90509250925092565b600080600060408486031215613e7157600080fd5b83356001600160401b0380821115613e8857600080fd5b613e94878388016138e3565b94506020860135915080821115613eaa57600080fd5b50613eb78682870161396e565b9497909650939450505050565b600060208284031215613ed657600080fd5b815161354f81613bb0565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e19843603018112613f5557600080fd5b8301803591506001600160401b03821115613f6f57600080fd5b6020019150600581901b36038213156139b257600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613fb057613fb0613f87565b500190565b6000808335601e19843603018112613fcc57600080fd5b8301803591506001600160401b03821115613fe657600080fd5b6020019150368190038213156139b257600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252604e908201527f456967656e506f642e616674657252657374616b696e673a2074696d6573746160408201527f6d70206d757374206265206174206f722061667465722072657374616b696e6760608201526d081dd85cc81858dd1a5d985d195960921b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156140df57600080fd5b813564ffffffffff8116811461354f57600080fd5b600060001982141561410857614108613f87565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156141a457818101518382015260200161418c565b838111156120915750506000910152565b600081518084526141cd816020860160208601614189565b601f01601f19169290920160200192915050565b6080815260006141f560808301888a614160565b828103602084015261420781886141b5565b9050828103604084015261421c818688614160565b915050826060830152979650505050505050565b602081526000611e93602083018486614160565b634e487b7160e01b600052601260045260246000fd5b60008261426957614269614244565b500690565b60008261427d5761427d614244565b500490565b60006001600160401b03838116908316818110156142a2576142a2613f87565b039392505050565b60008235605e198336030181126142c057600080fd5b9190910192915050565b6000816142d9576142d9613f87565b506000190190565b600080821280156001600160ff1b038490038513161561430357614303613f87565b600160ff1b839003841281161561431c5761431c613f87565b50500190565b600081600019048311821515161561433c5761433c613f87565b500290565b60008282101561435357614353613f87565b500390565b600082516142c0818460208701614189565b60006020828403121561437c57600080fd5b5051919050565b600181815b808511156143be5781600019048211156143a4576143a4613f87565b808516156143b157918102915b93841c9390800290614388565b509250929050565b6000826143d557506001610f8d565b816143e257506000610f8d565b81600181146143f857600281146144025761441e565b6001915050610f8d565b60ff84111561441357614413613f87565b50506001821b610f8d565b5060208310610133831016604e8410600b8410161715614441575081810a610f8d565b61444b8383614383565b806000190482111561445f5761445f613f87565b029392505050565b600061354f83836143c6565b805160208083015191908110156138f55760001960209190910360031b1b16919050565b600083516144a9818460208801614189565b6001600160801b0319939093169190920190815260100192915050565b60006001600160ff1b03818413828413808216868404861116156144ec576144ec613f87565b600160ff1b600087128281168783058912161561450b5761450b613f87565b6000871292508782058712848416161561452757614527613f87565b8785058712818416161561453d5761453d613f87565b505050929093029392505050565b60006001600160401b0380831681851680830382111561456d5761456d613f87565b01949350505050565b600064ffffffffff8084168061458e5761458e614244565b92169190910492915050565b60008083128015600160ff1b8501841216156145b8576145b8613f87565b6001600160ff1b03840183138116156145d3576145d3613f87565b50500390565b600064ffffffffff808416806145f1576145f1614244565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561462157614621613f87565b02949350505050565b60208152600061354f60208301846141b556fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220ccd67325fb3c0d39c3403dd3ef4915bf6967aa9c780f851997d4ad7246ddf6d264736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index ad06d2eb9..5ecfe23a0 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -220,7 +220,7 @@ contract EigenPod is // - validator submitted twice during this checkpoint // - validator withdrawal credentials verified after checkpoint starts, then submitted // as a checkpoint proof - if (validatorInfo.mostRecentBalanceUpdateTimestamp < beaconTimestamp) { + if (validatorInfo.mostRecentBalanceUpdateTimestamp >= beaconTimestamp) { continue; } From 3a7ff2aae8091f0dba810b360f2167ad371fd68a Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Wed, 29 May 2024 12:06:46 -0400 Subject: [PATCH 12/85] test: modify integration test framework to support pepe (#563) * test: basic epoch processing * wip: balance proofs somewhat functional * test: flesh out beacon chain abi and test workflow * test: cleanup * test: add basic invariant checks for checkpoint proofs * test: add tests for full exits --- src/test/integration/IntegrationBase.t.sol | 291 +++- src/test/integration/IntegrationChecks.t.sol | 52 +- .../integration/IntegrationDeployer.t.sol | 46 +- src/test/integration/TimeMachine.t.sol | 12 - .../integration/mocks/BeaconChainMock.t.sol | 1463 +++++++++-------- .../mocks/EIP_4788_Oracle_Mock.t.sol | 32 + src/test/integration/tests/Test.t.sol | 219 +++ src/test/integration/users/User.t.sol | 435 +++-- src/test/integration/users/User_M1.t.sol | 4 +- src/test/integration/utils/PrintUtils.t.sol | 119 ++ 10 files changed, 1731 insertions(+), 942 deletions(-) create mode 100644 src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol create mode 100644 src/test/integration/tests/Test.t.sol create mode 100644 src/test/integration/utils/PrintUtils.t.sol diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index af993a656..fdbd176d4 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -44,13 +44,13 @@ abstract contract IntegrationBase is IntegrationDeployer { uint[] memory tokenBalances; if (forkType == MAINNET && !isUpgraded) { - stakerName = string.concat("- M1_Staker", numStakers.toString()); + stakerName = string.concat("M1_Staker", numStakers.toString()); (staker, strategies, tokenBalances) = _randUser(stakerName); stakersToMigrate.push(staker); } else { - stakerName = string.concat("- Staker", numStakers.toString()); + stakerName = string.concat("Staker", numStakers.toString()); (staker, strategies, tokenBalances) = _randUser(stakerName); } @@ -73,7 +73,7 @@ abstract contract IntegrationBase is IntegrationDeployer { uint[] memory tokenBalances; if (forkType == MAINNET && !isUpgraded) { - string memory operatorName = string.concat("- M1_Operator", numOperators.toString()); + string memory operatorName = string.concat("M1_Operator", numOperators.toString()); // Create an operator for M1. We omit native ETH because we want to // check staker/operator shares, and we don't award native ETH shares in M1 @@ -86,7 +86,7 @@ abstract contract IntegrationBase is IntegrationDeployer { operatorsToMigrate.push(operator); } else { - string memory operatorName = string.concat("- Operator", numOperators.toString()); + string memory operatorName = string.concat("Operator", numOperators.toString()); (operator, strategies, tokenBalances) = _randUser(operatorName); @@ -129,15 +129,7 @@ abstract contract IntegrationBase is IntegrationDeployer { // Bump block.timestamp forward to allow verifyWC proofs for migrated pods emit log("advancing block time to start of next epoch:"); - uint64 curEpoch = _timeStampToEpoch(uint64(block.timestamp)); - uint64 nextEpochStartTime = _nextEpochStartTimestamp(curEpoch); - - emit log_named_uint("- current time", block.timestamp); - emit log_named_uint("- current epoch", curEpoch); - emit log_named_uint("- next epoch starts at", nextEpochStartTime); - - cheats.warp(nextEpochStartTime); - beaconChain.setNextTimestamp(nextEpochStartTime); + beaconChain.advanceEpoch(); emit log("======"); @@ -154,21 +146,9 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - /// From EigenPod.sol, using genesis time configured in ExistingDeploymentParser - function _timeStampToEpoch(uint64 timestamp) internal view returns (uint64) { - require(timestamp >= EIGENPOD_GENESIS_TIME, "EigenPod._timestampToEpoch: timestamp is before genesis"); - return (timestamp - EIGENPOD_GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; - } - - /// From EigenPod.sol, using genesis time configured in ExistingDeploymentParser - function _nextEpochStartTimestamp(uint64 epoch) internal view returns (uint64) { - return - EIGENPOD_GENESIS_TIME + ((1 + epoch) * BeaconChainProofs.SECONDS_PER_EPOCH); - } - - /** - * Common assertions: - */ + /******************************************************************************* + COMMON ASSERTIONS + *******************************************************************************/ function assert_HasNoDelegatableShares(User user, string memory err) internal { (IStrategy[] memory strategies, uint[] memory shares) = @@ -287,13 +267,23 @@ abstract contract IntegrationBase is IntegrationDeployer { ) internal { assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err); } + + function assert_ProofsRemainingEqualsActive( + User staker, + string memory err + ) internal { + EigenPod pod = staker.pod(); + assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err); + } /******************************************************************************* SNAPSHOT ASSERTIONS TIME TRAVELERS ONLY BEYOND THIS POINT *******************************************************************************/ - /// Snapshot assertions for delegationManager.operatorShares: + /******************************************************************************* + SNAPSHOT ASSERTIONS: OPERATOR SHARES + *******************************************************************************/ /// @dev Check that the operator has `addedShares` additional operator shares // for each strategy since the last snapshot @@ -371,7 +361,9 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - /// Snapshot assertions for strategyMgr.stakerStrategyShares and eigenPodMgr.podOwnerShares: + /******************************************************************************* + SNAPSHOT ASSERTIONS: STAKER SHARES + *******************************************************************************/ /// @dev Check that the staker has `addedShares` additional delegatable shares /// for each strategy since the last snapshot @@ -391,6 +383,27 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function assert_Snap_Added_StakerShares( + User staker, + IStrategy strat, + uint _addedShares, + string memory err + ) internal { + IStrategy[] memory strategies = new IStrategy[](1); + uint[] memory addedShares = new uint[](1); + strategies[0] = strat; + addedShares[0] = _addedShares; + + uint[] memory curShares = _getStakerShares(staker, strategies); + // Use timewarp to get previous staker shares + uint[] memory prevShares = _getPrevStakerShares(staker, strategies); + + // For each strategy, check (prev + added == cur) + for (uint i = 0; i < strategies.length; i++) { + assertApproxEqAbs(prevShares[i] + addedShares[i], curShares[i], 1, err); + } + } + /// @dev Check that the staker has `removedShares` fewer delegatable shares /// for each strategy since the last snapshot function assert_Snap_Removed_StakerShares( @@ -427,6 +440,26 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function assert_Snap_Delta_StakerShares( + User staker, + IStrategy[] memory strategies, + int[] memory shareDeltas, + string memory err + ) internal { + int[] memory curShares = _getStakerSharesInt(staker, strategies); + // Use timewarp to get previous staker shares + int[] memory prevShares = _getPrevStakerSharesInt(staker, strategies); + + // For each strategy, check (prev + added == cur) + for (uint i = 0; i < strategies.length; i++) { + assertEq(prevShares[i] + shareDeltas[i], curShares[i], err); + } + } + + /******************************************************************************* + SNAPSHOT ASSERTIONS: STRATEGY SHARES + *******************************************************************************/ + function assert_Snap_Removed_StrategyShares( IStrategy[] memory strategies, uint[] memory removedShares, @@ -466,23 +499,9 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - function assert_Snap_Delta_StakerShares( - User staker, - IStrategy[] memory strategies, - int[] memory shareDeltas, - string memory err - ) internal { - int[] memory curShares = _getStakerSharesInt(staker, strategies); - // Use timewarp to get previous staker shares - int[] memory prevShares = _getPrevStakerSharesInt(staker, strategies); - - // For each strategy, check (prev + added == cur) - for (uint i = 0; i < strategies.length; i++) { - assertEq(prevShares[i] + shareDeltas[i], curShares[i], err); - } - } - - /// Snapshot assertions for underlying token balances: + /******************************************************************************* + SNAPSHOT ASSERTIONS: UNDERLYING TOKEN + *******************************************************************************/ /// @dev Check that the staker has `addedTokens` additional underlying tokens // since the last snapshot @@ -543,7 +562,9 @@ abstract contract IntegrationBase is IntegrationDeployer { } } - /// Other snapshot assertions: + /******************************************************************************* + SNAPSHOT ASSERTIONS: QUEUED WITHDRAWALS + *******************************************************************************/ function assert_Snap_Added_QueuedWithdrawals( User staker, @@ -569,6 +590,120 @@ abstract contract IntegrationBase is IntegrationDeployer { assertEq(prevQueuedWithdrawal + 1, curQueuedWithdrawal, err); } + /******************************************************************************* + SNAPSHOT ASSERTIONS: EIGENPODS + *******************************************************************************/ + + function assert_Snap_Added_ActiveValidatorCount( + User staker, + uint addedValidators, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(prevActiveValidatorCount + addedValidators, curActiveValidatorCount, err); + } + + function assert_Snap_Removed_ActiveValidatorCount( + User staker, + uint exitedValidators, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(curActiveValidatorCount + exitedValidators, prevActiveValidatorCount, err); + } + + function assert_Snap_Added_ActiveValidators( + User staker, + uint40[] memory addedValidators, + string memory err + ) internal { + bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(addedValidators); + + IEigenPod.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + IEigenPod.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + + for (uint i = 0; i < curStatuses.length; i++) { + assertTrue(prevStatuses[i] == IEigenPod.VALIDATOR_STATUS.INACTIVE, err); + assertTrue(curStatuses[i] == IEigenPod.VALIDATOR_STATUS.ACTIVE, err); + } + } + + function assert_Snap_Removed_ActiveValidators( + User staker, + uint40[] memory exitedValidators, + string memory err + ) internal { + bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(exitedValidators); + + IEigenPod.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + IEigenPod.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + + for (uint i = 0; i < curStatuses.length; i++) { + assertTrue(prevStatuses[i] == IEigenPod.VALIDATOR_STATUS.ACTIVE, err); + assertTrue(curStatuses[i] == IEigenPod.VALIDATOR_STATUS.WITHDRAWN, err); + } + } + + function assert_Snap_Created_Checkpoint( + User staker, + string memory err + ) internal { + uint64 curCheckpointTimestamp = _getCheckpointTimestamp(staker); + uint64 prevCheckpointTimestamp = _getPrevCheckpointTimestamp(staker); + + assertEq(prevCheckpointTimestamp, 0, err); + assertTrue(curCheckpointTimestamp != 0, err); + } + + function assert_Snap_Removed_Checkpoint( + User staker, + string memory err + ) internal { + uint64 curCheckpointTimestamp = _getCheckpointTimestamp(staker); + uint64 prevCheckpointTimestamp = _getPrevCheckpointTimestamp(staker); + + assertEq(curCheckpointTimestamp, 0, err); + assertTrue(prevCheckpointTimestamp != 0, err); + } + + function assert_Snap_Updated_LastCheckpoint( + User staker, + string memory err + ) internal { + // Sorry for the confusing naming... the pod variable is called `lastCheckpointTimestamp` + uint64 curLastCheckpointTimestamp = _getLastCheckpointTimestamp(staker); + uint64 prevLastCheckpointTimestamp = _getPrevLastCheckpointTimestamp(staker); + + assertTrue(curLastCheckpointTimestamp > prevLastCheckpointTimestamp, err); + } + + function assert_Snap_Added_PodBalanceToWithdrawable( + User staker, + string memory err + ) internal { + uint64 curWithdrawableRestakedGwei = _getWithdrawableRestakedGwei(staker); + uint64 prevWithdrawableRestakedGwei = _getPrevWithdrawableRestakedGwei(staker); + + uint64 prevCheckpointPodBalanceGwei = _getPrevCheckpointPodBalanceGwei(staker); + + assertEq(prevWithdrawableRestakedGwei + prevCheckpointPodBalanceGwei, curWithdrawableRestakedGwei, err); + } + + function assert_Snap_Added_WithdrawableGwei( + User staker, + uint64 addedGwei, + string memory err + ) internal { + uint64 curWithdrawableRestakedGwei = _getWithdrawableRestakedGwei(staker); + uint64 prevWithdrawableRestakedGwei = _getPrevWithdrawableRestakedGwei(staker); + + assertEq(prevWithdrawableRestakedGwei + addedGwei, curWithdrawableRestakedGwei, err); + } + /******************************************************************************* UTILITY METHODS *******************************************************************************/ @@ -916,4 +1051,64 @@ abstract contract IntegrationBase is IntegrationDeployer { return shares; } + + function _getActiveValidatorCount(User staker) internal view returns (uint) { + EigenPod pod = staker.pod(); + return pod.activeValidatorCount(); + } + + function _getPrevActiveValidatorCount(User staker) internal timewarp() returns (uint) { + return _getActiveValidatorCount(staker); + } + + function _getValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal view returns (IEigenPod.VALIDATOR_STATUS[] memory) { + EigenPod pod = staker.pod(); + IEigenPod.VALIDATOR_STATUS[] memory statuses = new IEigenPod.VALIDATOR_STATUS[](pubkeyHashes.length); + + for (uint i = 0; i < statuses.length; i++) { + statuses[i] = pod.validatorStatus(pubkeyHashes[i]); + } + + return statuses; + } + + function _getPrevValidatorStatuses(User staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (IEigenPod.VALIDATOR_STATUS[] memory) { + return _getValidatorStatuses(staker, pubkeyHashes); + } + + function _getCheckpointTimestamp(User staker) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return pod.currentCheckpointTimestamp(); + } + + function _getPrevCheckpointTimestamp(User staker) internal timewarp() returns (uint64) { + return _getCheckpointTimestamp(staker); + } + + function _getLastCheckpointTimestamp(User staker) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return pod.lastCheckpointTimestamp(); + } + + function _getPrevLastCheckpointTimestamp(User staker) internal timewarp() returns (uint64) { + return _getLastCheckpointTimestamp(staker); + } + + function _getWithdrawableRestakedGwei(User staker) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return pod.withdrawableRestakedExecutionLayerGwei(); + } + + function _getPrevWithdrawableRestakedGwei(User staker) internal timewarp() returns (uint64) { + return _getWithdrawableRestakedGwei(staker); + } + + function _getCheckpointPodBalanceGwei(User staker) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return uint64(pod.currentCheckpoint().podBalanceGwei); + } + + function _getPrevCheckpointPodBalanceGwei(User staker) internal timewarp() returns (uint64) { + return _getCheckpointPodBalanceGwei(staker); + } } \ No newline at end of file diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 9ca5e3fd6..b8f8a133e 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -7,7 +7,57 @@ import "src/test/integration/users/User_M1.t.sol"; /// @notice Contract that provides utility functions to reuse common test blocks & checks contract IntegrationCheckUtils is IntegrationBase { - + + /******************************************************************************* + EIGENPOD CHECKS + *******************************************************************************/ + + function check_VerifyWC_State( + User staker, + uint40[] memory validators, + uint beaconBalanceWei + ) internal { + assert_Snap_Added_StakerShares(staker, BEACONCHAIN_ETH_STRAT, beaconBalanceWei, "staker should have added 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_StartCheckpoint_State( + User staker + ) internal { + assert_ProofsRemainingEqualsActive(staker, "checkpoint proofs remaining should equal active validator count"); + assert_Snap_Created_Checkpoint(staker, "staker should have created a new checkpoint"); + } + + function check_EmptyCheckpoint_State( + User staker + ) internal { + revert("TODO"); + } + + function check_CompleteCheckpoint_State( + User staker + ) internal { + assert_Snap_Removed_Checkpoint(staker, "should have deleted active checkpoint"); + assert_Snap_Updated_LastCheckpoint(staker, "last checkpoint timestamp should be updated"); + assert_Snap_Added_PodBalanceToWithdrawable(staker, "pod balance should have been added to withdrawable restaked exec layer gwei"); + } + + function check_CompleteCheckpoint_WithExits_State( + User staker, + uint40[] memory exitedValidators, + uint64 exitedBalanceGwei + ) internal { + check_CompleteCheckpoint_State(staker); + assert_Snap_Added_WithdrawableGwei(staker, exitedBalanceGwei, "should have added expected gwei to withdrawable restaked exec layer gwei"); + 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"); + } + + /******************************************************************************* + LST/DELEGATION CHECKS + *******************************************************************************/ + function check_Deposit_State( User staker, IStrategy[] memory strategies, diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 74e76e80d..401202959 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -21,7 +21,6 @@ import "src/contracts/permissions/PauserRegistry.sol"; import "src/test/mocks/EmptyContract.sol"; import "src/test/mocks/ETHDepositMock.sol"; -import "src/test/integration/mocks/BeaconChainOracleMock.t.sol"; import "src/test/integration/mocks/BeaconChainMock.t.sol"; import "src/test/integration/users/User.t.sol"; @@ -41,6 +40,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { uint256 holeskyForkId; uint64 constant DENEB_FORK_TIMESTAMP = 1705473120; + // 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 = 1606824023; TimeMachine public timeMachine; @@ -58,7 +61,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Mock Contracts to deploy ETHPOSDepositMock ethPOSDeposit; - BeaconChainOracleMock public beaconChainOracle; BeaconChainMock public beaconChain; // Admin Addresses @@ -222,7 +224,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Deploy mocks EmptyContract emptyContract = new EmptyContract(); ethPOSDeposit = new ETHPOSDepositMock(); - beaconChainOracle = new BeaconChainOracleMock(); /** * First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are @@ -252,7 +253,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - 0 + GENESIS_TIME_LOCAL ); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); @@ -358,11 +359,10 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allStrats.push(BEACONCHAIN_ETH_STRAT); allTokens.push(NATIVE_ETH); - // Create time machine and set block timestamp forward so we can create EigenPod proofs in the past + // Create time machine and beacon chain. Set block time to beacon chain genesis time + cheats.warp(GENESIS_TIME_LOCAL); timeMachine = new TimeMachine(); - timeMachine.setProofGenStartTime(2 hours); - // Create mock beacon chain / proof gen interface - beaconChain = new BeaconChainMock(timeMachine, beaconChainOracle, eigenPodManager); + beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_LOCAL); //set deneb fork timestamp eigenPodManager.setDenebForkTimestamp(type(uint64).max); @@ -385,7 +385,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, - 0 + GENESIS_TIME_MAINNET ); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); // Deploy AVSDirectory, contract has not been deployed on mainnet yet @@ -462,9 +462,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - timeMachine.setProofGenStartTime(0); - beaconChain.setNextTimestamp(timeMachine.proofGenStartTime()); - if (eigenPodManager.denebForkTimestamp() == type(uint64).max) { //set deneb fork timestamp if not set eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP); @@ -570,9 +567,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - timeMachine.setProofGenStartTime(0); - beaconChain.setNextTimestamp(timeMachine.proofGenStartTime()); - if (eigenPodManager.denebForkTimestamp() == type(uint64).max) { //set deneb fork timestamp if not set eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP); @@ -683,11 +677,9 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allTokens.push(strategy.underlyingToken()); } - // Create time machine and set block timestamp forward so we can create EigenPod proofs in the past + // Create time machine and mock beacon chain timeMachine = new TimeMachine(); - beaconChainOracle = new BeaconChainOracleMock(); - // Create mock beacon chain / proof gen interface - beaconChain = new BeaconChainMock(timeMachine, beaconChainOracle, eigenPodManager); + beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_MAINNET); } else if (forkType == HOLESKY) { revert("_deployOrFetchContracts - holesky tests currently broken sorry"); // cheats.selectFork(holeskyForkId); @@ -716,11 +708,9 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodImplementation.eigenPodManager(), 0 ); - // Create time machine and set block timestamp forward so we can create EigenPod proofs in the past + // Create time machine and mock beacon chain timeMachine = new TimeMachine(); - beaconChainOracle = new BeaconChainOracleMock(); - // Create mock beacon chain / proof gen interface - beaconChain = new BeaconChainMock(timeMachine, beaconChainOracle, eigenPodManager); + beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_MAINNET); cheats.startPrank(executorMultisig); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); @@ -866,8 +856,9 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { strategies = new IStrategy[](1); tokenBalances = new uint[](1); - // Award the user with a random multiple of 32 ETH - uint amount = 32 ether * _randUint({ min: 1, max: 3 }); + // Award the user with a random amount of ETH + // This guarantees at least 1 ETH, and at most (32 * 20) ETH + uint amount = 1 ether * _randUint({ min: 1, max: 640 }); cheats.deal(address(user), amount); strategies[0] = BEACONCHAIN_ETH_STRAT; @@ -888,8 +879,9 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { strategies[i] = strat; } - // Award the user with a random multiple of 32 ETH - uint amount = 32 ether * _randUint({ min: 1, max: 3 }); + // Award the user with a random amount of ETH + // This guarantees at least 1 ETH, and at most (32 * 20) ETH + uint amount = 1 ether * _randUint({ min: 1, max: 640 }); cheats.deal(address(user), amount); // Add BEACONCHAIN_ETH_STRAT and eth balance diff --git a/src/test/integration/TimeMachine.t.sol b/src/test/integration/TimeMachine.t.sol index 7158f9db8..aabb47d4b 100644 --- a/src/test/integration/TimeMachine.t.sol +++ b/src/test/integration/TimeMachine.t.sol @@ -10,8 +10,6 @@ contract TimeMachine is Test { bool pastExists = false; uint lastSnapshot; - uint64 public proofGenStartTime; - function createSnapshot() public returns (uint) { uint snapshot = cheats.snapshot(); lastSnapshot = snapshot; @@ -32,14 +30,4 @@ contract TimeMachine is Test { function warpToPresent(uint curState) public { cheats.revertTo(curState); } - - /// @dev Sets the timestamp we use for proof gen to now, - /// then sets block timestamp to now + secondsAgo. - /// - /// This means we can create mock proofs using an oracle time - /// of `proofGenStartTime`. - function setProofGenStartTime(uint secondsAgo) public { - proofGenStartTime = uint64(block.timestamp); - cheats.warp(block.timestamp + secondsAgo); - } } diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index c92dc5feb..3125c7317 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -8,78 +8,145 @@ import "src/contracts/libraries/Merkle.sol"; import "src/contracts/pods/EigenPodManager.sol"; import "src/test/integration/TimeMachine.t.sol"; -import "src/test/integration/mocks/BeaconChainOracleMock.t.sol"; +import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol"; +import "src/test/integration/utils/PrintUtils.t.sol"; -struct CredentialsProofs { - uint64 oracleTimestamp; +struct ValidatorFieldsProof { + bytes32[] validatorFields; + bytes validatorFieldsProof; +} + +struct BalanceRootProof { + bytes32 balanceRoot; + bytes proof; +} + +struct CheckpointProofs { + BeaconChainProofs.StateRootProof stateRootProof; + BeaconChainProofs.BalanceProof[] balanceProofs; +} + +struct CredentialProofs { + uint64 beaconTimestamp; BeaconChainProofs.StateRootProof stateRootProof; - uint40[] validatorIndices; bytes[] validatorFieldsProofs; bytes32[][] validatorFields; } -// struct BeaconWithdrawal { -// uint64 oracleTimestamp; -// BeaconChainProofs.StateRootProof stateRootProof; -// BeaconChainProofs.WithdrawalProof[] withdrawalProofs; -// bytes[] validatorFieldsProofs; -// bytes32[][] validatorFields; -// bytes32[][] withdrawalFields; -// } - -// struct BalanceUpdate { -// uint64 oracleTimestamp; -// BeaconChainProofs.StateRootProof stateRootProof; -// uint40[] validatorIndices; -// bytes[] validatorFieldsProofs; -// bytes32[][] validatorFields; -// } - -contract BeaconChainMock is Test { +contract BeaconChainMock is PrintUtils { Vm cheats = Vm(HEVM_ADDRESS); struct Validator { + bool isDummy; bytes32 pubkeyHash; - uint40 validatorIndex; bytes withdrawalCreds; uint64 effectiveBalanceGwei; + uint64 exitEpoch; } + + /// @dev All withdrawals are processed with index == 0 + uint64 constant WITHDRAWAL_INDEX = 0; + uint constant GWEI_TO_WEI = 1e9; + uint constant ZERO_NODES_LENGTH = 100; + + // Rewards given to each validator during epoch processing + uint64 constant CONSENSUS_REWARD_AMOUNT_GWEI = 1; + + /// PROOF CONSTANTS (PROOF LENGTHS, FIELD SIZES): + + // see https://eth2book.info/capella/part3/containers/state/#beaconstate + uint constant BEACON_STATE_FIELDS = 32; + // see https://eth2book.info/capella/part3/containers/blocks/#beaconblock + uint constant BEACON_BLOCK_FIELDS = 5; + + uint immutable BLOCKROOT_PROOF_LEN = 32 * BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT; + uint immutable VAL_FIELDS_PROOF_LEN = 32 * ( + (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT + ); + uint immutable BALANCE_PROOF_LEN = 32 * ( + (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT + ); - uint40 nextValidatorIndex = 0; + uint64 genesisTime; uint64 public nextTimestamp; + + EigenPodManager eigenPodManager; + EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02); - // Sequential list of created Validators - // Validator[] validators; - // mapping(uint40 => Validator) validators; + /** + * BeaconState containers, used for proofgen: + * https://eth2book.info/capella/part3/containers/state/#beaconstate + */ - mapping(uint40 => Validator) validators; + // Validator container, references every validator created so far + Validator[] validators; - BeaconChainOracleMock oracle; - EigenPodManager eigenPodManager; + // Current balance container, keeps a balance for every validator + // + // Since balances are stored in groups of 4, it's easier to make + // this a mapping rather than an array. If it were an array, its + // length would be validators.length / 4; + mapping(uint40 => bytes32) balances; - /// @dev All withdrawals are processed with index == 0 - uint64 constant WITHDRAWAL_INDEX = 0; - uint constant GWEI_TO_WEI = 1e9; + /** + * Generated proofs for each block timestamp: + */ + + // Maps block.timestamp -> calculated beacon block roots + mapping(uint64 => bytes32) beaconBlockRoots; + + // Keeps track of the index of the last validator we've seen during epoch processing + uint lastIndexProcessed; + uint64 curTimestamp; + + // Maps block.timestamp -> beacon state root and proof + mapping(uint64 => BeaconChainProofs.StateRootProof) stateRootProofs; + + // Maps block.timestamp -> validatorIndex -> credential proof for that timestamp + mapping(uint64 => mapping(uint40 => ValidatorFieldsProof)) validatorFieldsProofs; + + // Maps block.timestamp -> balanceRootIndex -> balance proof for that timestamp + mapping(uint64 => mapping(uint40 => BalanceRootProof)) balanceRootProofs; - constructor(TimeMachine timeMachine, BeaconChainOracleMock beaconChainOracle, EigenPodManager _eigenPodManager) { - nextTimestamp = timeMachine.proofGenStartTime(); - oracle = beaconChainOracle; + bytes32[] zeroNodes; + + constructor(TimeMachine timeMachine, EigenPodManager _eigenPodManager, uint64 _genesisTime) { + genesisTime = _genesisTime; eigenPodManager = _eigenPodManager; + + // Create mock 4788 oracle + cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode); + + // Calculate nodes of empty merkle tree + bytes32 curNode = Merkle.merkleizeSha256(new bytes32[](8)); + zeroNodes = new bytes32[](ZERO_NODES_LENGTH); + zeroNodes[0] = curNode; + + for (uint i = 1; i < zeroNodes.length; i++) { + zeroNodes[i] = sha256(abi.encodePacked(curNode, curNode)); + curNode = zeroNodes[i]; + } } - - /** - * @dev Processes a deposit for a new validator and returns the - * information needed to prove withdrawal credentials. - * - * For now, this returns empty proofs that will pass in the oracle, - * but in the future this should use FFI to return a valid proof. - */ - function newValidator( - uint balanceWei, + + function NAME() public view override returns (string memory) { + return "BeaconChain"; + } + + /******************************************************************************* + EXTERNAL METHODS + *******************************************************************************/ + + /// @dev Creates a new validator by: + /// - Creating the validator container + /// - Setting their current/effective balance + /// - Assigning them a new, unique index + function newValidator( bytes memory withdrawalCreds - ) public returns (uint40, CredentialsProofs memory) { - emit log_named_uint("- BeaconChain.newValidator with balance: ", balanceWei); + ) public payable returns (uint40) { + _logM("newValidator"); + + uint balanceWei = msg.value; // These checks mimic the checks made in the beacon chain deposit contract // @@ -91,688 +158,615 @@ contract BeaconChainMock is Test { uint depositAmount = balanceWei / GWEI_TO_WEI; require(depositAmount <= type(uint64).max, "BeaconChainMock.newValidator: deposit value too high"); - // Create unique index for new validator - uint40 validatorIndex = nextValidatorIndex; - nextValidatorIndex++; + // Create new validator and return its unique index + return _createValidator(withdrawalCreds, uint64(depositAmount)); + } + + /// @dev Initiate an exit by: + /// - Updating the validator's exit epoch + /// - Decreasing current balance to 0 + /// - Withdrawing the balance to the validator's withdrawal credentials + /// NOTE that the validator's effective balance is unchanged until advanceEpoch is called + /// @return exitedBalanceGwei The balance exited to the withdrawal address + /// + /// This partially mimics the beacon chain's behavior, which is: + /// 1. when an exit is initiated, the validator's exit/withdrawable epochs are immediately set + /// 2. in a future slot (as part of the withdrawal queue), the validator's current balance is set to 0 + /// - at the end of this slot, the eth is withdrawn to the withdrawal credentials + /// 3. when the epoch finalizes, the validator's effective balance is updated + /// + /// Because this mock beacon chain doesn't implement a withdrawal queue or per-slot processing, + /// `exitValidator` combines steps 1 and 2 into this method. + /// + /// TODO we may need to advance a slot here to maintain the properties we want in startCheckpoint + function exitValidator(uint40 validatorIndex) public returns (uint64 exitedBalanceGwei) { + _logM("exitValidator"); + + // Update validator.exitEpoch + Validator storage v = validators[validatorIndex]; + require(!v.isDummy, "BeaconChainMock: attempting to exit dummy validator. We need those for proofgen >:("); + require(v.exitEpoch == BeaconChainProofs.FAR_FUTURE_EPOCH, "BeaconChainMock: validator already exited"); + v.exitEpoch = currentEpoch() + 1; + + // Set current balance to 0 + exitedBalanceGwei = _currentBalanceGwei(validatorIndex); + _setCurrentBalance(validatorIndex, 0); - // Create new validator and record in state - Validator memory validator = Validator({ - pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), - validatorIndex: validatorIndex, - withdrawalCreds: withdrawalCreds, - effectiveBalanceGwei: uint64(depositAmount) - }); - validators[validatorIndex] = validator; + // Send current balance to pod + address destination = _toAddress(validators[validatorIndex].withdrawalCreds); + cheats.deal(destination, address(destination).balance + uint(uint(exitedBalanceGwei) * GWEI_TO_WEI)); - return (validator.validatorIndex, _genCredentialsProof(validator)); + return exitedBalanceGwei; } - /** - * @dev Exit a validator from the beacon chain, given its validatorIndex - * The passed-in validatorIndex should correspond to a validator created - * via `newValidator` above. - * - * This method will return the exit proofs needed to process eigenpod withdrawals. - * Additionally, it will send the withdrawal amount to the validator's withdrawal - * destination. - */ - // function exitValidator(uint40 validatorIndex) public returns (BeaconWithdrawal memory) { - // emit log_named_uint("- BeaconChain.exitValidator: ", validatorIndex); + /// @dev Move forward one epoch on the beacon chain, taking care of important epoch processing: + /// - Award ALL validators CONSENSUS_REWARD_AMOUNT + /// - Withdraw any balance over 32 ETH + /// - Withdraw any balance for exited validators + /// - Effective balances updated (NOTE: we do not use hysteresis!) + /// - Move time forward one epoch + /// - State root calculated and credential/balance proofs generated for all validators + /// - Send state root to 4788 oracle + /// + /// Note: + /// - DOES generate consensus rewards for ALL non-exited validators + /// - DOES withdraw in excess of 32 ETH / if validator is exited + function advanceEpoch() public { + _logM("advanceEpoch"); + + _generateRewards(); + _withdrawExcess(); + + _advanceEpoch(); + } - // Validator memory validator = validators[validatorIndex]; + - // // Get the withdrawal amount and destination - // uint amountToWithdraw = validator.effectiveBalanceGwei * GWEI_TO_WEI; - // address destination = _toAddress(validator.withdrawalCreds); + /// @dev Like `advanceEpoch`, but does NOT generate consensus rewards for validators. + /// This amount is added to each validator's current balance before effective balances + /// are updated. + /// + /// Note: + /// - does NOT generate consensus rewards + /// - DOES withdraw in excess of 32 ETH / if validator is exited + function advanceEpoch_NoRewards() public { + _logM("advanceEpoch_NoRewards"); + + _withdrawExcess(); - // // Generate exit proofs for a full exit - // BeaconWithdrawal memory withdrawal = _genExitProof(validator); + _advanceEpoch(); + } - // // Update state - set validator balance to zero and send balance to withdrawal destination - // validators[validatorIndex].effectiveBalanceGwei = 0; - // cheats.deal(destination, destination.balance + amountToWithdraw); + /// @dev Like `advanceEpoch`, but explicitly does NOT withdraw if balances + /// are over 32 ETH. This exists to support tests that check share increases solely + /// due to beacon chain balance changes. + /// + /// Note: + /// - DOES generate consensus rewards for ALL non-exited validators + /// - does NOT withdraw in excess of 32 ETH + /// - does NOT withdraw if validator is exited + function advanceEpoch_NoWithdraw() public { + _logM("advanceEpoch_NoWithdraw"); + + _generateRewards(); - // return withdrawal; - // } + _advanceEpoch(); + } - /** - * Note: `delta` is expected to be a raw token amount. This method will convert the delta to Gwei - */ - // function updateBalance(uint40 validatorIndex, int delta) public returns (BalanceUpdate memory) { - // delta /= int(GWEI_TO_WEI); - - // emit log_named_uint("- BeaconChain.updateBalance for validator: ", validatorIndex); - // emit log_named_int("- BeaconChain.updateBalance delta gwei: ", delta); + /// @dev Iterate over all validators. If the validator is still active, + /// add CONSENSUS_REWARD_AMOUNT_GWEI to its current balance + function _generateRewards() internal { + uint totalRewarded; + for (uint i = 0; i < validators.length; i++) { + Validator storage v = validators[i]; + if (v.isDummy) continue; // don't process dummy validators + + // If validator has not initiated exit, add rewards to their current balance + if (v.exitEpoch == BeaconChainProofs.FAR_FUTURE_EPOCH) { + uint64 balanceGwei = _currentBalanceGwei(uint40(i)); + balanceGwei += CONSENSUS_REWARD_AMOUNT_GWEI; + totalRewarded++; + + _setCurrentBalance(uint40(i), balanceGwei); + } + } + + _log("- generated rewards for num validators", totalRewarded); + } + + /// @dev Iterate over all validators. If the validator has > 32 ETH current balance + /// OR is exited, withdraw the excess to the validator's withdrawal address. + function _withdrawExcess() internal { + uint totalExcessWei; + for (uint i = 0; i < validators.length; i++) { + Validator storage v = validators[i]; + if (v.isDummy) continue; // don't process dummy validators + + uint balanceWei = uint(_currentBalanceGwei(uint40(i))) * GWEI_TO_WEI; + address destination = _toAddress(v.withdrawalCreds); + uint excessBalanceWei; + uint64 newBalanceGwei = uint64(balanceWei / GWEI_TO_WEI); + + // If the validator has exited, withdraw any existing balance + // + // If the validator has > 32 ether, withdraw anything over that + if (v.exitEpoch != BeaconChainProofs.FAR_FUTURE_EPOCH) { + if (balanceWei == 0) continue; + + excessBalanceWei = balanceWei; + newBalanceGwei = 0; + } else if (balanceWei > 32 ether) { + excessBalanceWei = balanceWei - 32 ether; + newBalanceGwei = 32 gwei; + } + + // Send ETH to withdrawal address + cheats.deal(destination, address(destination).balance + excessBalanceWei); + totalExcessWei += excessBalanceWei; + + // Update validator's current balance + _setCurrentBalance(uint40(i), newBalanceGwei); + } + + if (totalExcessWei != 0) + _log("- withdrew excess balance", totalExcessWei); + } + + function _advanceEpoch() public { + // Update effective balances for each validator + for (uint i = 0; i < validators.length; i++) { + Validator storage v = validators[i]; + if (v.isDummy) continue; // don't process dummy validators + + // Get current balance and trim anything over 32 ether + uint64 balanceGwei = _currentBalanceGwei(uint40(i)); + if (balanceGwei > 32 gwei) { + balanceGwei = 32 gwei; + } + + v.effectiveBalanceGwei = balanceGwei; + } + + _log("- updated effective balances"); + _log("- jumping to next epoch:"); + + // Move forward one epoch + _log("-- current time", block.timestamp); + _log("-- current epoch", currentEpoch()); + + uint64 curEpoch = currentEpoch(); + cheats.warp(_nextEpochStartTimestamp(curEpoch)); + curTimestamp = uint64(block.timestamp); + + _log("-- new time", block.timestamp); + _log("-- new epoch", currentEpoch()); + + _log("- updating beacon state"); + + // Log total number of validators and number being processed for the first time + _log("-- total num validators", validators.length); + lastIndexProcessed = validators.length - 1; + + // Build merkle tree for validators + bytes32 validatorsRoot = _buildMerkleTree({ + leaves: _getValidatorLeaves(), + treeHeight: BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1, + tree: trees[curTimestamp].validatorTree + }); + // _log("-- validator container root", validatorsRoot); - // // Apply delta and update validator balance in state - // uint64 newBalance; - // if (delta <= 0) { - // newBalance = validators[validatorIndex].effectiveBalanceGwei - uint64(uint(-delta)); - // } else { - // newBalance = validators[validatorIndex].effectiveBalanceGwei + uint64(uint(delta)); - // } - // validators[validatorIndex].effectiveBalanceGwei = newBalance; + // Build merkle tree for current balances + bytes32 balancesRoot = _buildMerkleTree({ + leaves: _getBalanceLeaves(), + treeHeight: BeaconChainProofs.BALANCE_TREE_HEIGHT + 1, + tree: trees[curTimestamp].balancesTree + }); + // _log("-- balances container root", balancesRoot); - // // Generate balance update proof - // Validator memory validator = validators[validatorIndex]; - // BalanceUpdate memory update = _genBalanceUpdateProof(validator); + // Build merkle tree for BeaconState + bytes32 beaconStateRoot = _buildMerkleTree({ + leaves: _getBeaconStateLeaves(validatorsRoot, balancesRoot), + treeHeight: BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT, + tree: trees[curTimestamp].stateTree + }); + // _log("-- beacon state root", beaconStateRoot); + + // Build merkle tree for BeaconBlock + bytes32 beaconBlockRoot = _buildMerkleTree({ + leaves: _getBeaconBlockLeaves(beaconStateRoot), + treeHeight: BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT, + tree: trees[curTimestamp].blockTree + }); + _log("-- beacon block root", beaconBlockRoot); - // return update; - // } + // Push new block root to oracle + EIP_4788_ORACLE.setBlockRoot(curTimestamp, beaconBlockRoot); - function setNextTimestamp(uint64 timestamp) public { - nextTimestamp = timestamp; + // Pre-generate proofs to pass to EigenPod methods + _genStateRootProof(beaconStateRoot); + _genCredentialProofs(); + _genBalanceProofs(); } - function balanceOfGwei(uint40 validatorIndex) public view returns (uint64) { - return validators[validatorIndex].effectiveBalanceGwei; + /******************************************************************************* + INTERNAL FUNCTIONS + *******************************************************************************/ + + function _createValidator(bytes memory withdrawalCreds, uint64 balanceGwei) internal returns (uint40) { + uint40 validatorIndex = uint40(validators.length); + + // HACK to make balance proofs work. Every 4 validators we create + // a dummy validator with empty withdrawal credentials and a unique + // balance value. This ensures that each balanceRoot is unique, which + // allows our efficient beacon state builder to work. + // + // For more details on this hack see _buildMerkleTree + if (validatorIndex % 4 == 0) { + uint64 dummyBalanceGwei = type(uint64).max - uint64(validators.length); + + validators.push(Validator({ + isDummy: true, + pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), + withdrawalCreds: "", + effectiveBalanceGwei: dummyBalanceGwei, + exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH + })); + _setCurrentBalance(validatorIndex, dummyBalanceGwei); + + validatorIndex++; + } + + validators.push(Validator({ + isDummy: false, + pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), + withdrawalCreds: withdrawalCreds, + effectiveBalanceGwei: balanceGwei, + exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH + })); + _setCurrentBalance(validatorIndex, balanceGwei); + + return validatorIndex; } - function pubkeyHash(uint40 validatorIndex) public view returns (bytes32) { - return validators[validatorIndex].pubkeyHash; + struct Tree { + mapping(bytes32 => bytes32) siblings; + mapping(bytes32 => bytes32) parents; } - /** - * INTERNAL/HELPER METHODS: - */ + struct MerkleTrees { + Tree validatorTree; + Tree balancesTree; + Tree stateTree; + Tree blockTree; + } - /** - * @dev For a new validator, generate the beacon chain block root and merkle proof - * needed to prove withdrawal credentials to an EigenPod. - * - * The generated block root is sent to the `BeaconChainOracleMock`, and can be - * queried using `proof.oracleTimestamp` to validate the generated proof. - */ - function _genCredentialsProof(Validator memory validator) internal returns (CredentialsProofs memory) { - CredentialsProofs memory proof; - - proof.validatorIndices = new uint40[](1); - proof.validatorIndices[0] = validator.validatorIndex; - - // Create validatorFields for the new validator - proof.validatorFields = new bytes32[][](1); - proof.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); - proof.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; - proof.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = - bytes32(validator.withdrawalCreds); - proof.validatorFields[0][BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = - _toLittleEndianUint64(validator.effectiveBalanceGwei); - - // Calculate beaconStateRoot using validator index and an empty proof: - proof.validatorFieldsProofs = new bytes[](1); - proof.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); - bytes32 validatorRoot = Merkle.merkleizeSha256(proof.validatorFields[0]); - uint index = _calcValProofIndex(validator.validatorIndex); - - bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - proof: proof.validatorFieldsProofs[0], - leaf: validatorRoot, - index: index - }); + /// Timestamp -> merkle trees constructed at that timestamp + /// Used to generate proofs + mapping(uint64 => MerkleTrees) trees; + + /// @dev Builds a merkle tree using the given leaves and height + /// -- if the leaves given are not complete (i.e. the depth should have more leaves), + /// a pre-calculated zero-node is used to complete the tree. + /// -- each pair of nodes is stored in `siblings`, and their parent in `parents`. + /// These mappings are used to build proofs for any individual leaf + /// @return The root of the merkle tree + /// + /// HACK: this sibling/parent method of tree construction relies on all passed-in leaves + /// being unique, so that we don't overwrite siblings/parents. This is simple for trees + /// like the validator tree, as each leaf is a validator's unique validatorFields. + /// However, for the balances tree, the leaves may not be distinct. To get around this, + /// _createValidator adds "dummy" validators every 4 validators created, with a unique + /// balance value. This ensures each balance root is unique. + function _buildMerkleTree( + bytes32[] memory leaves, + uint treeHeight, + Tree storage tree + ) internal returns (bytes32) { + for (uint depth = 0; depth < treeHeight; depth++) { + uint newLength = (leaves.length + 1) / 2; + bytes32[] memory newLeaves = new bytes32[](newLength); + + // Hash each pair of nodes in this level of the tree + for (uint i = 0; i < newLength; i++) { + uint leftIdx = 2 * i; + uint rightIdx = leftIdx + 1; + + // Get left leaf + bytes32 leftLeaf = leaves[leftIdx]; + + // Calculate right leaf + bytes32 rightLeaf; + if (rightIdx < leaves.length) { + rightLeaf = leaves[rightIdx]; + } else { + rightLeaf = _getZeroNode(depth); + } - // Calculate blockRoot using beaconStateRoot and an empty proof: - bytes memory blockRootProof = new bytes(BLOCKROOT_PROOF_LEN); - bytes32 blockRoot = Merkle.processInclusionProofSha256({ - proof: blockRootProof, - leaf: beaconStateRoot, - index: BeaconChainProofs.STATE_ROOT_INDEX - }); + // Hash left and right + bytes32 result = sha256(abi.encodePacked(leftLeaf, rightLeaf)); + newLeaves[i] = result; + + // Record results, used to generate individual proofs later: + // Record left and right as siblings + tree.siblings[leftLeaf] = rightLeaf; + tree.siblings[rightLeaf] = leftLeaf; + // Record the result as the parent of left and right + tree.parents[leftLeaf] = result; + tree.parents[rightLeaf] = result; + } - proof.stateRootProof = BeaconChainProofs.StateRootProof({ - beaconStateRoot: beaconStateRoot, - proof: blockRootProof - }); + // Move up one level + leaves = newLeaves; + } + + require(leaves.length == 1, "BeaconChainMock._buildMerkleTree: invalid tree somehow"); + return leaves[0]; + } + + function _genStateRootProof(bytes32 beaconStateRoot) internal { + bytes memory proof = new bytes(BLOCKROOT_PROOF_LEN); + bytes32 curNode = beaconStateRoot; + + for (uint i = 0; i < BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT; i++) { + bytes32 sibling = trees[curTimestamp].blockTree.siblings[curNode]; - // Send the block root to the oracle and increment timestamp: - proof.oracleTimestamp = uint64(nextTimestamp); + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, i))), + sibling + ) + } - oracle.setBlockRoot(nextTimestamp, blockRoot); - nextTimestamp++; + curNode = trees[curTimestamp].blockTree.parents[curNode]; + } - return proof; + stateRootProofs[curTimestamp] = BeaconChainProofs.StateRootProof({ + beaconStateRoot: beaconStateRoot, + proof: proof + }); } - - /** - * @dev Generates the proofs and roots needed to prove a validator's exit from - * the beacon chain. - * - * The generated beacon block root is sent to `BeaconChainOracleMock`, and can - * be queried using `withdrawal.oracleTimestamp` to validate the generated proof. - * - * Since a withdrawal proof requires proving multiple leaves in the same tree, this - * method uses `_genConvergentProofs` to calculate proofs and roots for intermediate - * subtrees, while retaining the information needed to supply an eigenpod with a proof. - * - * The overall merkle tree being proven looks like this: - * - * - beaconBlockRoot (submitted to oracle at end) - * -- beaconStateRoot - * ---- validatorFieldsRoot - * ---- blockRoot (from historical summaries) - * -------- slotRoot - * -------- executionPayloadRoot - * ---------------- timestampRoot - * ---------------- withdrawalFieldsRoot - * - * This method first generates proofs for the lowest leaves, and uses the resulting - * intermediate hashes to generate proofs for higher leaves. Eventually, all of these - * roots are calculated and the final beaconBlockRoot can be calculated and sent to the - * oracle. - */ - // function _genExitProof(Validator memory validator) internal returns (BeaconWithdrawal memory) { - // BeaconWithdrawal memory withdrawal; - // uint64 withdrawalEpoch = uint64(block.timestamp); - - // // Get a new, unique timestamp for queries to the oracle - // withdrawal.oracleTimestamp = uint64(nextTimestamp); - // nextTimestamp++; - - // // Initialize proof arrays - // BeaconChainProofs.WithdrawalProof memory withdrawalProof = _initWithdrawalProof({ - // withdrawalEpoch: withdrawalEpoch, - // withdrawalIndex: WITHDRAWAL_INDEX, - // oracleTimestamp: withdrawal.oracleTimestamp - // }); - - // // Calculate withdrawalFields and record the validator's index and withdrawal amount - // withdrawal.withdrawalFields = new bytes32[][](1); - // withdrawal.withdrawalFields[0] = new bytes32[](2 ** BeaconChainProofs.WITHDRAWAL_FIELD_TREE_HEIGHT); - // withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX] = - // _toLittleEndianUint64(validator.validatorIndex); - // withdrawal.withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] = - // _toLittleEndianUint64(validator.effectiveBalanceGwei); - - // { - // /** - // * Generate proofs then root for subtree: - // * - // * executionPayloadRoot - // * - timestampRoot (withdrawalProof.timestampProof) - // * - withdrawalFieldsRoot (withdrawalProof.withdrawalProof) - // */ - // withdrawalProof.executionPayloadRoot = _genExecPayloadProofs({ - // withdrawalProof: withdrawalProof, - // withdrawalRoot: Merkle.merkleizeSha256(withdrawal.withdrawalFields[0]) - // }); - // } - - // { - // /** - // * Generate proofs then root for subtree: - // * - // * blockRoot (historical summaries) - // * - slotRoot (withdrawalProof.slotProof) - // * - executionPayloadRoot (withdrawalProof.executionPayloadProof) - // */ - // withdrawalProof.blockRoot = _genBlockRootProofs({ - // withdrawalProof: withdrawalProof - // }); - // } - - // // validatorFields - // withdrawal.validatorFields = new bytes32[][](1); - // withdrawal.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); - // withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; - // withdrawal.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWABLE_EPOCH_INDEX] = - // _toLittleEndianUint64(withdrawalEpoch); - - // withdrawal.validatorFieldsProofs = new bytes[](1); - // withdrawal.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); - - // { - // /** - // * Generate proofs then root for subtree: - // * - // * beaconStateRoot - // * - validatorFieldsRoot (withdrawal.validatorFieldsProofs[0]) - // * - blockRoot (historical summaries) (withdrawalProof.historicalSummaryBlockRootProof) - // */ - // withdrawal.stateRootProof.beaconStateRoot = _genBeaconStateRootProofs({ - // withdrawalProof: withdrawalProof, - // validatorFieldsProof: withdrawal.validatorFieldsProofs[0], - // validatorIndex: validator.validatorIndex, - // validatorRoot: Merkle.merkleizeSha256(withdrawal.validatorFields[0]) - // }); - // } - - // withdrawal.withdrawalProofs = new BeaconChainProofs.WithdrawalProof[](1); - // withdrawal.withdrawalProofs[0] = withdrawalProof; - - // // Calculate beaconBlockRoot using beaconStateRoot and an empty proof: - // withdrawal.stateRootProof.proof = new bytes(BLOCKROOT_PROOF_LEN); - // bytes32 beaconBlockRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawal.stateRootProof.proof, - // leaf: withdrawal.stateRootProof.beaconStateRoot, - // index: BeaconChainProofs.STATE_ROOT_INDEX - // }); - - // // Send the block root to the oracle - // oracle.setBlockRoot(withdrawal.oracleTimestamp, beaconBlockRoot); - // return withdrawal; - // } - - // function _genBalanceUpdateProof(Validator memory validator) internal returns (BalanceUpdate memory) { - // BalanceUpdate memory update; - - // update.validatorIndices = new uint40[](1); - // update.validatorIndices[0] = validator.validatorIndex; - - // // Create validatorFields showing the balance update - // update.validatorFields = new bytes32[][](1); - // update.validatorFields[0] = new bytes32[](2 ** BeaconChainProofs.VALIDATOR_FIELD_TREE_HEIGHT); - // update.validatorFields[0][BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = validator.pubkeyHash; - // update.validatorFields[0][BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = - // bytes32(validator.withdrawalCreds); - // update.validatorFields[0][BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = - // _toLittleEndianUint64(validator.effectiveBalanceGwei); - - // // Calculate beaconStateRoot using validator index and an empty proof: - // update.validatorFieldsProofs = new bytes[](1); - // update.validatorFieldsProofs[0] = new bytes(VAL_FIELDS_PROOF_LEN); - // bytes32 validatorRoot = Merkle.merkleizeSha256(update.validatorFields[0]); - // uint index = _calcValProofIndex(validator.validatorIndex); - - // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - // proof: update.validatorFieldsProofs[0], - // leaf: validatorRoot, - // index: index - // }); - - // // Calculate blockRoot using beaconStateRoot and an empty proof: - // bytes memory blockRootProof = new bytes(BLOCKROOT_PROOF_LEN); - // bytes32 blockRoot = Merkle.processInclusionProofSha256({ - // proof: blockRootProof, - // leaf: beaconStateRoot, - // index: BeaconChainProofs.STATE_ROOT_INDEX - // }); - - // update.stateRootProof = BeaconChainProofs.StateRootProof({ - // beaconStateRoot: beaconStateRoot, - // proof: blockRootProof - // }); - - // // Send the block root to the oracle and increment timestamp: - // update.oracleTimestamp = uint64(nextTimestamp); - // oracle.setBlockRoot(nextTimestamp, blockRoot); - // nextTimestamp++; - - // return update; - // } - /** - * @dev Generates converging merkle proofs for timestampRoot and withdrawalRoot - * under the executionPayloadRoot. - * - * `withdrawalProof.timestampProof` and `withdrawalProof.withdrawalProof` are - * directly updated here. - * - * @return executionPayloadRoot - */ - // function _genExecPayloadProofs( - // BeaconChainProofs.WithdrawalProof memory withdrawalProof, - // bytes32 withdrawalRoot - // ) internal view returns (bytes32) { - - // uint withdrawalProofIndex = - // (BeaconChainProofs.WITHDRAWALS_INDEX << (BeaconChainProofs.WITHDRAWALS_TREE_HEIGHT + 1)) | - // uint(withdrawalProof.withdrawalIndex); - - // /** - // * Generate merkle proofs for timestampRoot and withdrawalRoot - // * that converge at or before executionPayloadRoot. - // * - // * timestampProof length: 4 - // * withdrawalProof length: 9 - // */ - // _genConvergentProofs({ - // shortProof: withdrawalProof.timestampProof, - // shortIndex: BeaconChainProofs.TIMESTAMP_INDEX, - // shortLeaf: withdrawalProof.timestampRoot, - // longProof: withdrawalProof.withdrawalProof, - // longIndex: withdrawalProofIndex, - // longLeaf: withdrawalRoot - // }); - - // // Use generated proofs to calculate tree root and verify both proofs - // // result in the same root: - // bytes32 execPayloadRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawalProof.timestampProof, - // leaf: withdrawalProof.timestampRoot, - // index: BeaconChainProofs.TIMESTAMP_INDEX - // }); - - // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawalProof.withdrawalProof, - // leaf: withdrawalRoot, - // index: withdrawalProofIndex - // }); - - // require(execPayloadRoot == expectedRoot, "_genExecPayloadProofs: mismatched roots"); - - // return execPayloadRoot; - // } + function _genCredentialProofs() internal { + mapping(uint40 => ValidatorFieldsProof) storage vfProofs = validatorFieldsProofs[curTimestamp]; - /** - * @dev Generates converging merkle proofs for slotRoot and executionPayloadRoot - * under the block root (historical summaries). - * - * `withdrawalProof.slotProof` and `withdrawalProof.executionPayloadProof` are - * directly updated here. - * - * @return historical summary block root - */ - // function _genBlockRootProofs( - // BeaconChainProofs.WithdrawalProof memory withdrawalProof - // ) internal view returns (bytes32) { - - // uint slotRootIndex = BeaconChainProofs.SLOT_INDEX; - // uint execPayloadIndex = - // (BeaconChainProofs.BODY_ROOT_INDEX << BeaconChainProofs.BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT) | - // BeaconChainProofs.EXECUTION_PAYLOAD_INDEX; - - // /** - // * Generate merkle proofs for slotRoot and executionPayloadRoot - // * that converge at or before block root. - // * - // * slotProof length: 3 - // * executionPayloadProof length: 7 - // */ - // _genConvergentProofs({ - // shortProof: withdrawalProof.slotProof, - // shortIndex: slotRootIndex, - // shortLeaf: withdrawalProof.slotRoot, - // longProof: withdrawalProof.executionPayloadProof, - // longIndex: execPayloadIndex, - // longLeaf: withdrawalProof.executionPayloadRoot - // }); - - // // Use generated proofs to calculate tree root and verify both proofs - // // result in the same root: - // bytes32 blockRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawalProof.slotProof, - // leaf: withdrawalProof.slotRoot, - // index: slotRootIndex - // }); - - // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawalProof.executionPayloadProof, - // leaf: withdrawalProof.executionPayloadRoot, - // index: execPayloadIndex - // }); - - // require(blockRoot == expectedRoot, "_genBlockRootProofs: mismatched roots"); - - // return blockRoot; - // } + // Calculate credential proofs for each validator + for (uint i = 0; i < validators.length; i++) { - /** - * @dev Generates converging merkle proofs for block root and validatorRoot - * under the beaconStateRoot. - * - * `withdrawalProof.historicalSummaryBlockRootProof` and `validatorFieldsProof` are - * directly updated here. - * - * @return beaconStateRoot - */ - // function _genBeaconStateRootProofs( - // BeaconChainProofs.WithdrawalProof memory withdrawalProof, - // bytes memory validatorFieldsProof, - // uint40 validatorIndex, - // bytes32 validatorRoot - // ) internal view returns (bytes32) { - // uint blockHeaderIndex = _calcBlockHeaderIndex(withdrawalProof); - // uint validatorProofIndex = _calcValProofIndex(validatorIndex); - - // /** - // * Generate merkle proofs for validatorRoot and blockRoot - // * that converge at or before beaconStateRoot. - // * - // * historicalSummaryBlockRootProof length: 44 - // * validatorFieldsProof length: 46 - // */ - // _genConvergentProofs({ - // shortProof: withdrawalProof.historicalSummaryBlockRootProof, - // shortIndex: blockHeaderIndex, - // shortLeaf: withdrawalProof.blockRoot, - // longProof: validatorFieldsProof, - // longIndex: validatorProofIndex, - // longLeaf: validatorRoot - // }); - - // // Use generated proofs to calculate tree root and verify both proofs - // // result in the same root: - // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - // proof: withdrawalProof.historicalSummaryBlockRootProof, - // leaf: withdrawalProof.blockRoot, - // index: blockHeaderIndex - // }); - - // bytes32 expectedRoot = Merkle.processInclusionProofSha256({ - // proof: validatorFieldsProof, - // leaf: validatorRoot, - // index: validatorProofIndex - // }); - - // require(beaconStateRoot == expectedRoot, "_genBeaconStateRootProofs: mismatched roots"); - - // return beaconStateRoot; - // } + bytes memory proof = new bytes(VAL_FIELDS_PROOF_LEN); + bytes32[] memory validatorFields = _getValidatorFields(uint40(i)); + bytes32 curNode = Merkle.merkleizeSha256(validatorFields); - /** - * @dev Generates converging merkle proofs given two leaves and empty proofs. - * Basics: - * - `shortProof` and `longProof` start as empty proofs initialized to the correct - * length for their respective paths. - * - At the end of the method, `shortProof` and `longProof` are still entirely empty - * EXCEPT at the point where the proofs would normally converge under the root hash. - * - At this point, `shortProof` will be assigned the current hash for the `longLeaf` proof - * ... and `longProof` will be assigned the current hash for the `shortLeaf` proof - * - * Steps: - * 1. Because the beacon chain has trees and leaves at varying heights, this method - * first calculates the root of the longer proof's subtree so that the remaining - * proof length is the same for both leaves. - * 2. This method simultaneously computes each leaf's remaining proof step-by-step, - * performing effectively the same steps as `Merkle.processInclusionProof256`. - * 3. At each step, we check to see if the current indices represent sibling leaves. - * 4. If `shortIndex` and `longIndex` are siblings: - * - longProof[longProof_i] = curShortHash - * - shortProof[shortProof_i] = curLongHash - * - * ... Once we've found this convergence and placed each sibling's current hash in - * its opposing sibling's proof, we're done! - * @param shortProof An empty proof initialized to the correct length for the shorter proof path - * @param shortIndex The index of the - */ - function _genConvergentProofs( - bytes memory shortProof, - uint shortIndex, - bytes32 shortLeaf, - bytes memory longProof, - uint longIndex, - bytes32 longLeaf - ) internal view { - require(longProof.length >= shortProof.length, "_genConvergentProofs: invalid input"); - - bytes32[1] memory curShortHash = [shortLeaf]; - bytes32[1] memory curLongHash = [longLeaf]; - - // Calculate root of long subtree - uint longProofOffset = longProof.length - shortProof.length; - for (uint i = 32; i <= longProofOffset; i += 32) { - if (longIndex % 2 == 0) { - assembly { - mstore(0x00, mload(curLongHash)) - mstore(0x20, mload(add(longProof, i))) - } - } else { + // Validator fields leaf -> validator container root + uint depth = 0; + for (uint j = 0; j < 1 + BeaconChainProofs.VALIDATOR_TREE_HEIGHT; j++) { + bytes32 sibling = trees[curTimestamp].validatorTree.siblings[curNode]; + + // proof[j] = sibling; assembly { - mstore(0x00, mload(add(longProof, i))) - mstore(0x20, mload(curLongHash)) + mstore( + add(proof, add(32, mul(32, j))), + sibling + ) } + + curNode = trees[curTimestamp].validatorTree.parents[curNode]; + depth++; } - // Compute hash and divide index - assembly { - if iszero(staticcall(sub(gas(), 2000), 2, 0x00, 0x40, curLongHash, 0x20)) { - revert(0, 0) + // Validator container root -> beacon state root + for ( + uint j = depth; + j < 1 + BeaconChainProofs.VALIDATOR_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT; + j++ + ) { + bytes32 sibling = trees[curTimestamp].stateTree.siblings[curNode]; + + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, j))), + sibling + ) } - longIndex := div(longIndex, 2) + + curNode = trees[curTimestamp].stateTree.parents[curNode]; } + + // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ + // proof: proof, + // leaf: Merkle.merkleizeSha256(validatorFields), + // index: _calcValProofIndex(uint40(i)) + // }); + + // emit log_named_uint("proof for validator", i); + // emit log_named_bytes32("calculated beacon state root", beaconStateRoot); + + vfProofs[uint40(i)].validatorFields = validatorFields; + vfProofs[uint40(i)].validatorFieldsProof = proof; } + } - { - // Now that we've calculated the longest sub-tree, continue merklizing both trees simultaneously. - // When we reach two leaf indices s.t. A is even and B == A + 1, or vice versa, we know we have - // found the point where the two sub-trees converge. - uint longProof_i = 32 + longProofOffset; - uint shortProof_i = 32; - bool foundConvergence; - for (; longProof_i <= longProof.length; ) { - if (_areSiblings(longIndex, shortIndex)) { - foundConvergence = true; - assembly { - mstore(add(longProof, longProof_i), mload(curShortHash)) - mstore(add(shortProof, shortProof_i), mload(curLongHash)) - } - - break; - } - - // Compute next hash for longProof - { - if (longIndex % 2 == 0) { - assembly { - mstore(0x00, mload(curLongHash)) - mstore(0x20, mload(add(longProof, longProof_i))) - } - } else { - assembly { - mstore(0x00, mload(add(longProof, longProof_i))) - mstore(0x20, mload(curLongHash)) - } - } - - // Compute hash and divide index - assembly { - if iszero(staticcall(sub(gas(), 2000), 2, 0x00, 0x40, curLongHash, 0x20)) { - revert(0, 0) - } - longIndex := div(longIndex, 2) - } + function _genBalanceProofs() internal { + mapping(uint40 => BalanceRootProof) storage brProofs = balanceRootProofs[curTimestamp]; + + // Calculate current balance proofs for each balance root + uint numBalanceRoots = _numBalanceRoots(); + for (uint i = 0; i < numBalanceRoots; i++) { + + bytes memory proof = new bytes(BALANCE_PROOF_LEN); + bytes32 balanceRoot = balances[uint40(i)]; + bytes32 curNode = balanceRoot; + + // Balance root leaf -> balances container root + uint depth = 0; + for (uint j = 0; j < 1 + BeaconChainProofs.BALANCE_TREE_HEIGHT; j++) { + bytes32 sibling = trees[curTimestamp].balancesTree.siblings[curNode]; + + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, j))), + sibling + ) } - - // Compute next hash for shortProof - { - if (shortIndex % 2 == 0) { - assembly { - mstore(0x00, mload(curShortHash)) - mstore(0x20, mload(add(shortProof, shortProof_i))) - } - } else { - assembly { - mstore(0x00, mload(add(shortProof, shortProof_i))) - mstore(0x20, mload(curShortHash)) - } - } - - // Compute hash and divide index - assembly { - if iszero(staticcall(sub(gas(), 2000), 2, 0x00, 0x40, curShortHash, 0x20)) { - revert(0, 0) - } - shortIndex := div(shortIndex, 2) - } + + curNode = trees[curTimestamp].balancesTree.parents[curNode]; + depth++; + } + + // balances container root -> beacon state root + for ( + uint j = depth; + j < 1 + BeaconChainProofs.BALANCE_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT; + j++ + ) { + bytes32 sibling = trees[curTimestamp].stateTree.siblings[curNode]; + + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, j))), + sibling + ) } - longProof_i += 32; - shortProof_i += 32; + curNode = trees[curTimestamp].stateTree.parents[curNode]; } - require(foundConvergence, "proofs did not converge!"); + // emit log("==="); + + // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ + // proof: proof, + // leaf: balanceRoot, + // index: _calcBalanceProofIndex(uint40(i)) + // }); + + // emit log_named_uint("proof for balance root", i); + // emit log_named_bytes32("calculated beacon state root", beaconStateRoot); + + brProofs[uint40(i)].balanceRoot = balanceRoot; + brProofs[uint40(i)].proof = proof; } } - /** - * PROOF LENGTHS, MISC CONSTANTS, AND OTHER HELPERS: - */ + function _getValidatorLeaves() internal view returns (bytes32[] memory) { + bytes32[] memory leaves = new bytes32[](validators.length); + + // Place each validator's validatorFields into tree + for (uint i = 0; i < validators.length; i++) { + leaves[i] = Merkle.merkleizeSha256( + _getValidatorFields(uint40(i)) + ); + } - uint immutable BLOCKROOT_PROOF_LEN = 32 * BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT; - uint immutable VAL_FIELDS_PROOF_LEN = 32 * ( - (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT - ); + return leaves; + } - uint immutable WITHDRAWAL_PROOF_LEN_CAPELLA = 32 * ( - BeaconChainProofs.EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_CAPELLA + - BeaconChainProofs.WITHDRAWALS_TREE_HEIGHT + 1 - ); + function _getBalanceLeaves() internal view returns (bytes32[] memory) { + // Place each validator's current balance into tree + bytes32[] memory leaves = new bytes32[](_numBalanceRoots()); + for (uint i = 0; i < leaves.length; i++) { + leaves[i] = balances[uint40(i)]; + } - uint immutable WITHDRAWAL_PROOF_LEN_DENEB= 32 * ( - BeaconChainProofs.EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_DENEB + - BeaconChainProofs.WITHDRAWALS_TREE_HEIGHT + 1 - ); + return leaves; + } - uint immutable EXECPAYLOAD_PROOF_LEN = 32 * ( - BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT + - BeaconChainProofs.BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT - ); - uint immutable SLOT_PROOF_LEN = 32 * ( - BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT - ); - uint immutable TIMESTAMP_PROOF_LEN_CAPELLA = 32 * ( - BeaconChainProofs.EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_CAPELLA - ); - uint immutable TIMESTAMP_PROOF_LEN_DENEB = 32 * ( - BeaconChainProofs.EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_DENEB - ); - uint immutable HISTSUMMARY_PROOF_LEN = 32 * ( - BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT + - BeaconChainProofs.HISTORICAL_SUMMARIES_TREE_HEIGHT + - BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 2 - ); + function _numBalanceRoots() internal view returns (uint) { + // Each balance leaf is shared by 4 validators. This uses div_ceil + // to calculate the number of balance leaves + return (validators.length == 0) ? + 0 : ((validators.length - 1) / 4) + 1; + } - uint immutable HIST_SUMMARIES_PROOF_INDEX = BeaconChainProofs.HISTORICAL_SUMMARIES_INDEX << ( - BeaconChainProofs.HISTORICAL_SUMMARIES_TREE_HEIGHT + 1 + - BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 1 - ); + function _getBeaconStateLeaves(bytes32 validatorsRoot, bytes32 balancesRoot) internal pure returns (bytes32[] memory) { + bytes32[] memory leaves = new bytes32[](BEACON_STATE_FIELDS); + + // Pre-populate leaves with dummy values so sibling/parent tracking is correct + for (uint i = 0; i < leaves.length; i++) { + leaves[i] = bytes32(i + 1); + } + + // Place validatorsRoot and balancesRoot into tree + leaves[BeaconChainProofs.VALIDATOR_TREE_ROOT_INDEX] = validatorsRoot; + leaves[BeaconChainProofs.BALANCE_INDEX] = balancesRoot; + return leaves; + } + + function _getBeaconBlockLeaves(bytes32 beaconStateRoot) internal pure returns (bytes32[] memory) { + bytes32[] memory leaves = new bytes32[](BEACON_BLOCK_FIELDS); - // function _initWithdrawalProof( - // uint64 withdrawalEpoch, - // uint64 withdrawalIndex, - // uint64 oracleTimestamp - // ) internal view returns (BeaconChainProofs.WithdrawalProof memory) { - // uint256 withdrawalProofLength; - // uint256 timestampProofLength; - // if (block.timestamp > eigenPodManager.denebForkTimestamp()) { - // withdrawalProofLength = WITHDRAWAL_PROOF_LEN_DENEB; - // timestampProofLength = TIMESTAMP_PROOF_LEN_DENEB; - // } else { - // withdrawalProofLength = WITHDRAWAL_PROOF_LEN_CAPELLA; - // timestampProofLength = TIMESTAMP_PROOF_LEN_CAPELLA; - // } - // return BeaconChainProofs.WithdrawalProof({ - // withdrawalProof: new bytes(withdrawalProofLength), - // slotProof: new bytes(SLOT_PROOF_LEN), - // executionPayloadProof: new bytes(EXECPAYLOAD_PROOF_LEN), - // timestampProof: new bytes(timestampProofLength), - // historicalSummaryBlockRootProof: new bytes(HISTSUMMARY_PROOF_LEN), - // blockRootIndex: 0, - // historicalSummaryIndex: 0, - // withdrawalIndex: withdrawalIndex, - // blockRoot: bytes32(0), - // slotRoot: _toLittleEndianUint64(withdrawalEpoch * BeaconChainProofs.SLOTS_PER_EPOCH), - // timestampRoot: _toLittleEndianUint64(oracleTimestamp), - // executionPayloadRoot: bytes32(0) - // }); - // } - - // function _calcBlockHeaderIndex(BeaconChainProofs.WithdrawalProof memory withdrawalProof) internal view returns (uint) { - // return - // HIST_SUMMARIES_PROOF_INDEX | - // (uint(withdrawalProof.historicalSummaryIndex) << (BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT + 1)) | - // (BeaconChainProofs.BLOCK_SUMMARY_ROOT_INDEX << BeaconChainProofs.BLOCK_ROOTS_TREE_HEIGHT) | - // uint(withdrawalProof.blockRootIndex); - // } + // Pre-populate leaves with dummy values so sibling/parent tracking is correct + for (uint i = 0; i < leaves.length; i++) { + leaves[i] = bytes32(i + 1); + } + + // Place beaconStateRoot into tree + leaves[BeaconChainProofs.STATE_ROOT_INDEX] = beaconStateRoot; + return leaves; + } + + function _currentBalanceGwei(uint40 validatorIndex) internal view returns (uint64) { + return currentBalance(validatorIndex); + } + + function currentEpoch() public view returns (uint64) { + require(block.timestamp >= genesisTime, "BeaconChain.currentEpoch: current time is before genesis time"); + return uint64((block.timestamp - genesisTime) / BeaconChainProofs.SECONDS_PER_EPOCH); + } + + /// @dev Returns the validator's exit epoch + function exitEpoch(uint40 validatorIndex) public view returns (uint64) { + return validators[validatorIndex].exitEpoch; + } + + /// @dev Returns the validator's effective balance, in gwei + function effectiveBalance(uint40 validatorIndex) public view returns (uint64) { + return validators[validatorIndex].effectiveBalanceGwei; + } + + /// @dev Returns the validator's current balance, in gwei + function currentBalance(uint40 validatorIndex) public view returns (uint64) { + return BeaconChainProofs.getBalanceAtIndex( + getBalanceRoot(validatorIndex), + validatorIndex + ); + } + + function getBalanceRoot(uint40 validatorIndex) public view returns (bytes32) { + return balances[validatorIndex / 4]; + } + + function _getBalanceRootIndex(uint40 validatorIndex) internal view returns (uint40) { + return validatorIndex / 4; + } + + function _getValidatorFields(uint40 validatorIndex) internal view returns (bytes32[] memory) { + bytes32[] memory vFields = new bytes32[](8); + Validator memory v = validators[validatorIndex]; + + vFields[BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = v.pubkeyHash; + vFields[BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = bytes32(v.withdrawalCreds); + vFields[BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = _toLittleEndianUint64(v.effectiveBalanceGwei); + vFields[BeaconChainProofs.VALIDATOR_EXIT_EPOCH_INDEX] = _toLittleEndianUint64(BeaconChainProofs.FAR_FUTURE_EPOCH); + + return vFields; + } + + /// @dev Update the validator's current balance + function _setCurrentBalance(uint40 validatorIndex, uint64 newBalanceGwei) internal { + bytes32 balanceRoot = balances[validatorIndex / 4]; + balanceRoot = _calcBalanceRoot(balanceRoot, validatorIndex, newBalanceGwei); + + balances[validatorIndex / 4] = balanceRoot; + } + + /// From EigenPod.sol + function _nextEpochStartTimestamp(uint64 epoch) internal view returns (uint64) { + return + genesisTime + ((1 + epoch) * BeaconChainProofs.SECONDS_PER_EPOCH); + } function _calcValProofIndex(uint40 validatorIndex) internal pure returns (uint) { return @@ -780,13 +774,16 @@ contract BeaconChainMock is Test { uint(validatorIndex); } - /// @dev Returns true if a and b are sibling indices in the same sub-tree. - /// - /// i.e. the indices belong two child nodes that share a parent: - /// [A, B] or [B, A] - function _areSiblings(uint a, uint b) internal pure returns (bool) { - return - (a % 2 == 0 && b == a + 1) || (b % 2 == 0 && a == b + 1); + function _calcBalanceProofIndex(uint40 balanceRootIndex) internal pure returns (uint) { + return + (BeaconChainProofs.BALANCE_INDEX << (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1)) | + uint(balanceRootIndex); + } + + function _getZeroNode(uint depth) internal view returns (bytes32) { + require(depth < ZERO_NODES_LENGTH, "_getZeroNode: invalid depth"); + + return zeroNodes[depth]; } /// @dev Opposite of Endian.fromLittleEndianUint64 @@ -807,6 +804,22 @@ contract BeaconChainMock is Test { return bytes32(lenum << 192); } + /// @dev Opposite of BeaconChainProofs.getBalanceAtIndex, calculates a new balance + /// root by updating the balance at validatorIndex + /// @return The new, updated balance root + function _calcBalanceRoot(bytes32 balanceRoot, uint40 validatorIndex, uint64 newBalanceGwei) internal returns (bytes32) { + // Clear out old balance + uint bitShiftAmount = 256 - (64 * ((validatorIndex % 4) + 1)); + uint mask = ~(uint(0xFFFFFFFFFFFFFFFF) << bitShiftAmount); + uint clearedRoot = uint(balanceRoot) & mask; + + // Convert validator balance to little endian and shift to correct position + uint leBalance = uint(_toLittleEndianUint64(newBalanceGwei)); + uint shiftedBalance = leBalance >> (192 - bitShiftAmount); + + return bytes32(clearedRoot | shiftedBalance); + } + /// @dev Helper to convert 32-byte withdrawal credentials to an address function _toAddress(bytes memory withdrawalCreds) internal pure returns (address a) { bytes32 creds = bytes32(withdrawalCreds); @@ -814,4 +827,86 @@ contract BeaconChainMock is Test { assembly { a := and(creds, mask) } } + + /******************************************************************************* + VIEW METHODS + *******************************************************************************/ + + function getCredentialProofs(uint40[] memory _validators) public returns (CredentialProofs memory) { + // If we have not advanced an epoch since a validator was created, no proofs have been + // generated for that validator. We check this here and revert early so we don't return + // empty proofs. + for (uint i = 0; i < _validators.length; i++) { + require( + _validators[i] <= lastIndexProcessed, + "BeaconChain.getCredentialProofs: no credential proof found (did you call advanceEpoch yet?)" + ); + } + + CredentialProofs memory proofs = CredentialProofs({ + beaconTimestamp: curTimestamp, + stateRootProof: stateRootProofs[curTimestamp], + validatorFieldsProofs: new bytes[](_validators.length), + validatorFields: new bytes32[][](_validators.length) + }); + + // Get proofs for each validator + for (uint i = 0; i < _validators.length; i++) { + ValidatorFieldsProof memory proof = validatorFieldsProofs[curTimestamp][_validators[i]]; + proofs.validatorFieldsProofs[i] = proof.validatorFieldsProof; + proofs.validatorFields[i] = proof.validatorFields; + } + + return proofs; + } + + function getCheckpointProofs(uint40[] memory _validators) public view returns (CheckpointProofs memory) { + // If we have not advanced an epoch since a validator was created, no proofs have been + // generated for that validator. We check this here and revert early so we don't return + // empty proofs. + for (uint i = 0; i < _validators.length; i++) { + require( + _validators[i] <= lastIndexProcessed, + "BeaconChain.getCredentialProofs: no credential proof found (did you call advanceEpoch yet?)" + ); + } + + CheckpointProofs memory proofs = CheckpointProofs({ + stateRootProof: stateRootProofs[curTimestamp], + balanceProofs: new BeaconChainProofs.BalanceProof[](_validators.length) + }); + + // Get proofs for each validator + for (uint i = 0; i < _validators.length; i++) { + uint40 validatorIndex = _validators[i]; + uint40 balanceRootIndex = _getBalanceRootIndex(validatorIndex); + BalanceRootProof memory proof = balanceRootProofs[curTimestamp][balanceRootIndex]; + + proofs.balanceProofs[i] = BeaconChainProofs.BalanceProof({ + pubkeyHash: validators[validatorIndex].pubkeyHash, + balanceRoot: proof.balanceRoot, + proof: proof.proof + }); + } + + return proofs; + } + + function balanceOfGwei(uint40 validatorIndex) public view returns (uint64) { + return validators[validatorIndex].effectiveBalanceGwei; + } + + function pubkeyHash(uint40 validatorIndex) public view returns (bytes32) { + return validators[validatorIndex].pubkeyHash; + } + + function getPubkeyHashes(uint40[] memory _validators) public view returns (bytes32[] memory) { + bytes32[] memory pubkeyHashes = new bytes32[](_validators.length); + + for (uint i = 0; i < _validators.length; i++) { + pubkeyHashes[i] = validators[_validators[i]].pubkeyHash; + } + + return pubkeyHashes; + } } diff --git a/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol b/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol new file mode 100644 index 000000000..b83aac72a --- /dev/null +++ b/src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +contract EIP_4788_Oracle_Mock { + + mapping(uint => bytes32) blockRoots; + + uint constant HISTORY_BUFFER_LENGTH = 8191; + + fallback() external { + require(msg.data.length == 32, "4788OracleMock.fallback: malformed msg.data"); + + uint timestamp = abi.decode(msg.data, (uint)); + require(timestamp != 0, "4788OracleMock.fallback: timestamp is 0"); + + bytes32 blockRoot = blockRoots[timestamp]; + require(blockRoot != 0, "4788OracleMock.fallback: no block root found. DID YOU USE CHEATS.WARP?"); + + assembly { + mstore(0, blockRoot) + return(0, 32) + } + } + + function timestampToBlockRoot(uint timestamp) public view returns (bytes32) { + return blockRoots[uint64(timestamp)]; + } + + function setBlockRoot(uint64 timestamp, bytes32 blockRoot) public { + blockRoots[timestamp] = blockRoot; + } +} diff --git a/src/test/integration/tests/Test.t.sol b/src/test/integration/tests/Test.t.sol new file mode 100644 index 000000000..01f4c58c9 --- /dev/null +++ b/src/test/integration/tests/Test.t.sol @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "src/test/integration/IntegrationChecks.t.sol"; +import "src/test/integration/users/User.t.sol"; + +contract Integration_Tester is IntegrationCheckUtils { + + using Strings for *; + using StdStyle for *; + + string constant SECTION_DELIMITER = "======"; + + /******************************************************************************* + VERIFY -> START/COMPLETE CHECKPOINT + *******************************************************************************/ + + function test_VerifyAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + beaconChain.advanceEpoch(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + function test_VerifyAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + beaconChain.advanceEpoch_NoWithdraw(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + function test_VerifyAll_Start_CompleteCP_NoRewards(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + beaconChain.advanceEpoch_NoRewards(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + /******************************************************************************* + VERIFY -> EXIT -> START/COMPLETE CHECKPOINT + *******************************************************************************/ + + function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + uint64 exitedBalanceGwei = staker.exitValidators(validators); + beaconChain.advanceEpoch(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); + } + + function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + uint64 exitedBalanceGwei = staker.exitValidators(validators); + beaconChain.advanceEpoch_NoWithdraw(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); + } + + function test_VerifyAll_ExitAll_Start_CompleteCP_NoRewards(uint24 _rand) public { + _configRand({ + _randomSeed: _rand, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceWei); + + uint64 exitedBalanceGwei = staker.exitValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + // check pod balances have increased + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); + } + + function _logPod(User staker) internal { + EigenPod pod = staker.pod(); + + _logSection(string.concat(staker.NAME().cyan(), ": Pod Details")); + + _log("- hasRestaked", pod.hasRestaked()); + _log("- podOwnerShares", eigenPodManager.podOwnerShares(address(staker))); + _log("- activeValidatorCount", pod.activeValidatorCount()); + _logU64("- withdrawableRestakedELGwei", pod.withdrawableRestakedExecutionLayerGwei()); + + bool hasCheckpoint = pod.currentCheckpointTimestamp() != 0; + _log("- has checkpoint", hasCheckpoint); + if (hasCheckpoint) { + IEigenPod.Checkpoint memory checkpoint = pod.currentCheckpoint(); + _log("-- beaconBlockRoot", checkpoint.beaconBlockRoot); + _log("-- podBalanceGwei", checkpoint.podBalanceGwei); + _log("-- balanceDeltasGwei", checkpoint.balanceDeltasGwei); + _log("-- proofsRemaining", checkpoint.proofsRemaining); + } + + _logSection(""); + } + + function _logSection(string memory name) internal { + emit log(string.concat( + SECTION_DELIMITER, + name, + SECTION_DELIMITER + )); + } + + function _log(string memory name, bool value) internal { + emit log_named_string(name, value ? "true".green() : "false".magenta()); + } + + function _log(string memory name, bytes32 value) internal { + emit log_named_string(name, value.dimBytes32()); + } + + function _log(string memory name, uint value) internal { + emit log_named_uint(name, value); + } + + function _logU64(string memory name, uint64 value) internal { + emit log_named_uint(name, value); + } + + function _log(string memory name, int value) internal { + emit log_named_int(name, value); + } +} \ 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 8db15b699..fddc8886c 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -13,8 +13,11 @@ import "src/contracts/interfaces/IStrategy.sol"; import "src/test/integration/TimeMachine.t.sol"; import "src/test/integration/mocks/BeaconChainMock.t.sol"; -import "src/test/integration/mocks/BeaconChainOracleMock.t.sol"; +import "src/test/integration/utils/PrintUtils.t.sol"; +struct Validator { + uint40 index; +} interface IUserDeployer { function delegationManager() external view returns (DelegationManager); @@ -22,23 +25,20 @@ interface IUserDeployer { function eigenPodManager() external view returns (EigenPodManager); function timeMachine() external view returns (TimeMachine); function beaconChain() external view returns (BeaconChainMock); - function beaconChainOracle() external view returns (address); } -contract User is Test { +contract User is PrintUtils { Vm cheats = Vm(HEVM_ADDRESS); DelegationManager delegationManager; StrategyManager strategyManager; EigenPodManager eigenPodManager; - TimeMachine timeMachine; + BeaconChainMock beaconChain; - /// @dev Native restaker state vars + string _NAME; - BeaconChainMock beaconChain; - BeaconChainOracleMock beaconChainOracle; // User's EigenPod and each of their validator indices within that pod EigenPod public pod; uint40[] validators; @@ -47,8 +47,6 @@ contract User is Test { IERC20 constant NATIVE_ETH = IERC20(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); uint constant GWEI_TO_WEI = 1e9; - string public NAME; - constructor(string memory name) { IUserDeployer deployer = IUserDeployer(msg.sender); @@ -58,10 +56,9 @@ contract User is Test { timeMachine = deployer.timeMachine(); beaconChain = deployer.beaconChain(); - beaconChainOracle = BeaconChainOracleMock(deployer.beaconChainOracle()); _createPod(); - NAME = name; + _NAME = name; } modifier createSnapshot() virtual { @@ -71,12 +68,16 @@ contract User is Test { receive() external payable {} - /** - * DelegationManager methods: - */ + function NAME() public view override returns (string memory) { + return _NAME; + } + + /******************************************************************************* + DELEGATIONMANAGER METHODS + *******************************************************************************/ function registerAsOperator() public createSnapshot virtual { - emit log(_name(".registerAsOperator")); + _logM("registerAsOperator"); IDelegationManager.OperatorDetails memory details = IDelegationManager.OperatorDetails({ __deprecated_earningsReceiver: address(this), @@ -87,87 +88,9 @@ contract User is Test { delegationManager.registerAsOperator(details, "metadata"); } - /// @dev For each strategy/token balance, call the relevant deposit method - function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot virtual { - emit log(_name(".depositIntoEigenlayer")); - - for (uint i = 0; i < strategies.length; i++) { - IStrategy strat = strategies[i]; - uint tokenBalance = tokenBalances[i]; - - if (strat == BEACONCHAIN_ETH_STRAT) { - // We're depositing via `eigenPodManager.stake`, which only accepts - // deposits of exactly 32 ether. - require(tokenBalance % 32 ether == 0, "User.depositIntoEigenlayer: balance must be multiple of 32 eth"); - - // For each multiple of 32 ether, deploy a new validator to the same pod - uint numValidators = tokenBalance / 32 ether; - for (uint j = 0; j < numValidators; j++) { - eigenPodManager.stake{ value: 32 ether }("", "", bytes32(0)); - - (uint40 newValidatorIndex, CredentialsProofs memory proofs) = - beaconChain.newValidator({ - balanceWei: 32 ether, - withdrawalCreds: _podWithdrawalCredentials() - }); - - validators.push(newValidatorIndex); - emit log_named_uint("oracle timestamp", proofs.oracleTimestamp); - pod.verifyWithdrawalCredentials({ - beaconTimestamp: proofs.oracleTimestamp, - stateRootProof: proofs.stateRootProof, - validatorIndices: proofs.validatorIndices, - validatorFieldsProofs: proofs.validatorFieldsProofs, - validatorFields: proofs.validatorFields - }); - } - } else { - IERC20 underlyingToken = strat.underlyingToken(); - underlyingToken.approve(address(strategyManager), tokenBalance); - strategyManager.depositIntoStrategy(strat, underlyingToken, tokenBalance); - } - } - } - - function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public createSnapshot virtual { - emit log(_name(".updateBalances")); - revert("fail - placeholder"); - - // for (uint i = 0; i < strategies.length; i++) { - // IStrategy strat = strategies[i]; - // int delta = tokenDeltas[i]; - - // if (strat == BEACONCHAIN_ETH_STRAT) { - // // TODO - right now, we just grab the first validator - // uint40 validator = getUpdatableValidator(); - // BalanceUpdate memory update = beaconChain.updateBalance(validator, delta); - - // int sharesBefore = eigenPodManager.podOwnerShares(address(this)); - - // pod.verifyBalanceUpdates({ - // oracleTimestamp: update.oracleTimestamp, - // validatorIndices: update.validatorIndices, - // stateRootProof: update.stateRootProof, - // validatorFieldsProofs: update.validatorFieldsProofs, - // validatorFields: update.validatorFields - // }); - - // int sharesAfter = eigenPodManager.podOwnerShares(address(this)); - - // emit log_named_int("pod owner shares before: ", sharesBefore); - // emit log_named_int("pod owner shares after: ", sharesAfter); - // } else { - // uint tokens = uint(delta); - // IERC20 underlyingToken = strat.underlyingToken(); - // underlyingToken.approve(address(strategyManager), tokens); - // strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); - // } - // } - } - /// @dev Delegate to the operator without a signature function delegateTo(User operator) public createSnapshot virtual { - emit log_named_string(_name(".delegateTo: "), operator.NAME()); + _logM("delegateTo", operator.NAME()); ISignatureUtils.SignatureWithExpiry memory emptySig; delegationManager.delegateTo(address(operator), emptySig, bytes32(0)); @@ -175,7 +98,7 @@ contract User is Test { /// @dev Undelegate from operator function undelegate() public createSnapshot virtual returns(IDelegationManager.Withdrawal[] memory){ - emit log(_name(".undelegate")); + _logM("undelegate"); IDelegationManager.Withdrawal[] memory expectedWithdrawals = _getExpectedWithdrawalStructsForStaker(address(this)); delegationManager.undelegate(address(this)); @@ -192,7 +115,7 @@ contract User is Test { /// @dev Force undelegate staker function forceUndelegate(User staker) public createSnapshot virtual returns(IDelegationManager.Withdrawal[] memory){ - emit log_named_string(_name(".forceUndelegate: "), staker.NAME()); + _logM("forceUndelegate", staker.NAME()); IDelegationManager.Withdrawal[] memory expectedWithdrawals = _getExpectedWithdrawalStructsForStaker(address(staker)); delegationManager.undelegate(address(staker)); @@ -204,7 +127,7 @@ contract User is Test { IStrategy[] memory strategies, uint[] memory shares ) public createSnapshot virtual returns (IDelegationManager.Withdrawal[] memory) { - emit log(_name(".queueWithdrawals")); + _logM("queueWithdrawals"); address operator = delegationManager.delegatedTo(address(this)); address withdrawer = address(this); @@ -239,7 +162,7 @@ contract User is Test { } function completeWithdrawalsAsTokens(IDelegationManager.Withdrawal[] memory withdrawals) public createSnapshot virtual returns (IERC20[][] memory) { - emit log(_name(".completeWithdrawalsAsTokens")); + _logM("completeWithdrawalsAsTokens"); IERC20[][] memory tokens = new IERC20[][](withdrawals.length); @@ -251,13 +174,13 @@ contract User is Test { } function completeWithdrawalAsTokens(IDelegationManager.Withdrawal memory withdrawal) public createSnapshot virtual returns (IERC20[] memory) { - emit log(_name(".completeWithdrawalAsTokens")); + _logM("completeWithdrawalsAsTokens"); return _completeQueuedWithdrawal(withdrawal, true); } function completeWithdrawalsAsShares(IDelegationManager.Withdrawal[] memory withdrawals) public createSnapshot virtual returns (IERC20[][] memory) { - emit log(_name(".completeWithdrawalsAsShares")); + _logM("completeWithdrawalAsShares"); IERC20[][] memory tokens = new IERC20[][](withdrawals.length); @@ -269,21 +192,200 @@ contract User is Test { } function completeWithdrawalAsShares(IDelegationManager.Withdrawal memory withdrawal) public createSnapshot virtual returns (IERC20[] memory) { - emit log(_name(".completeWithdrawalAsShares")); + _logM("completeWithdrawalAsShares"); return _completeQueuedWithdrawal(withdrawal, false); } + /******************************************************************************* + BEACON CHAIN METHODS + *******************************************************************************/ + + /// @dev Uses any ETH held by the User to start validators on the beacon chain + /// @return A list of created validator indices + /// @return The amount of wei sent to the beacon chain + /// Note: If the user does not have enough ETH to start a validator, this method reverts + /// Note: This method also advances one epoch forward on the beacon chain, so that + /// withdrawal credential proofs are generated for each validator. + function startValidators() public createSnapshot virtual returns (uint40[] memory, uint) { + _logM("startValidators"); + + uint balanceWei = address(this).balance; + + // Number of full validators: balance / 32 ETH + uint numValidators = balanceWei / 32 ether; + balanceWei -= (numValidators * 32 ether); + + // If we still have at least 1 ETH left over, we can create another (non-full) validator + // Note that in the mock beacon chain this validator will generate rewards like any other. + // The main point is to ensure pods are able to handle validators that have less than 32 ETH + uint lastValidatorBalance; + uint totalValidators = numValidators; + if (balanceWei >= 1 ether) { + lastValidatorBalance = balanceWei - (balanceWei % 1 gwei); + balanceWei -= lastValidatorBalance; + totalValidators++; + } + + require(totalValidators != 0, "startValidators: not enough ETH to start a validator"); + uint40[] memory newValidators = new uint40[](totalValidators); + uint totalBeaconBalance = address(this).balance - balanceWei; + + _log("- creating new validators", newValidators.length); + _log("- depositing balance to beacon chain (wei)", totalBeaconBalance); + + // Create each of the full validators + for (uint i = 0; i < numValidators; i++) { + uint40 validatorIndex = beaconChain.newValidator{ + value: 32 ether + }(_podWithdrawalCredentials()); + + newValidators[i] = validatorIndex; + validators.push(validatorIndex); + } + + // If we had a remainder, create the final, non-full validator + if (totalValidators == numValidators + 1) { + uint40 validatorIndex = beaconChain.newValidator{ + value: lastValidatorBalance + }(_podWithdrawalCredentials()); + + newValidators[newValidators.length - 1] = validatorIndex; + validators.push(validatorIndex); + } + + // Advance forward one epoch and generate withdrawal and balance proofs for each validator + beaconChain.advanceEpoch_NoRewards(); + + return (newValidators, totalBeaconBalance); + } + + function exitValidators(uint40[] memory _validators) public createSnapshot virtual returns (uint64 exitedBalanceGwei) { + _logM("exitValidators"); + + _log("- exiting num validators", _validators.length); + + for (uint i = 0; i < _validators.length; i++) { + exitedBalanceGwei += beaconChain.exitValidator(_validators[i]); + } + + _log("- exited balance to pod (gwei)", exitedBalanceGwei); + + return exitedBalanceGwei; + } + + /******************************************************************************* + EIGENPOD METHODS + *******************************************************************************/ + + function verifyWithdrawalCredentials( + uint40[] memory _validators + ) public createSnapshot virtual { + _logM("verifyWithdrawalCredentials"); + + CredentialProofs memory proofs = beaconChain.getCredentialProofs(_validators); + + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: _validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + } + + function startCheckpoint() public createSnapshot virtual { + _logM("startCheckpoint"); + + pod.startCheckpoint(false); + } + + function completeCheckpoint() public createSnapshot virtual { + _logM("completeCheckpoint"); + + _log("- active validator count", pod.activeValidatorCount()); + _log("- proofs remaining", pod.currentCheckpoint().proofsRemaining); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs(validators); + _log("- submitting num checkpoint proofs", proofs.balanceProofs.length); + + pod.verifyCheckpointProofs({ + stateRootProof: proofs.stateRootProof, + proofs: proofs.balanceProofs + }); + } + /// @notice We set the proof generation start time to be after the timestamp that pod restaking is activated /// We do this to prevent proofIsForValidTimestamp modifier from reverting + /// TODO remove function activateRestaking() public createSnapshot { - emit log(_name(".activateRestaking")); + _logM("activateRestaking"); - emit log_named_uint("pre-activation, most recent wd timestamp", pod.mostRecentWithdrawalTimestamp()); + // _log("pre-activation, most recent wd timestamp", uint(pod.mostRecentWithdrawalTimestamp())); pod.activateRestaking(); - emit log_named_uint("post-activation, most recent wd timestamp", pod.mostRecentWithdrawalTimestamp()); + // _log("post-activation, most recent wd timestamp", pod.mostRecentWithdrawalTimestamp()); + } + + /******************************************************************************* + STRATEGYMANAGER METHODS + *******************************************************************************/ + + function depositLSTs(IStrategy[] memory strategies) public createSnapshot virtual { + // _log("depositIntoStrategies"); + + // for (uint i = 0; i < strategies.length; i++) { + // IStrategy strat = strategies[i]; + // uint tokenBalance = tokenBalances[i]; + + // IERC20 underlyingToken = strat.underlyingToken(); + // underlyingToken.approve(address(strategyManager), tokenBalance); + // strategyManager.depositIntoStrategy(strat, underlyingToken, tokenBalance); + // } + } + + /// @dev For each strategy/token balance, call the relevant deposit method + function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot virtual { + _logM("depositIntoEigenlayer"); + + revert("unimplemented"); + } + + function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public createSnapshot virtual { + _logM("updateBalances"); + revert("fail - placeholder"); + + // for (uint i = 0; i < strategies.length; i++) { + // IStrategy strat = strategies[i]; + // int delta = tokenDeltas[i]; + + // if (strat == BEACONCHAIN_ETH_STRAT) { + // // TODO - right now, we just grab the first validator + // uint40 validator = getUpdatableValidator(); + // BalanceUpdate memory update = beaconChain.updateBalance(validator, delta); + + // int sharesBefore = eigenPodManager.podOwnerShares(address(this)); + + // pod.verifyBalanceUpdates({ + // oracleTimestamp: update.oracleTimestamp, + // validatorIndices: update.validatorIndices, + // stateRootProof: update.stateRootProof, + // validatorFieldsProofs: update.validatorFieldsProofs, + // validatorFields: update.validatorFields + // }); + + // int sharesAfter = eigenPodManager.podOwnerShares(address(this)); + + // emit log_named_int("pod owner shares before: ", sharesBefore); + // emit log_named_int("pod owner shares after: ", sharesAfter); + // } else { + // uint tokens = uint(delta); + // IERC20 underlyingToken = strat.underlyingToken(); + // underlyingToken.approve(address(strategyManager), tokens); + // strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); + // } + // } } function _completeQueuedWithdrawal( @@ -375,10 +477,6 @@ contract User is Test { return expectedWithdrawals; } - function _name(string memory s) internal view returns (string memory) { - return string.concat(NAME, s); - } - function getUpdatableValidator() public view returns (uint40) { return validators[0]; } @@ -392,7 +490,8 @@ contract User_AltMethods is User { constructor(string memory name) User(name) {} function delegateTo(User operator) public createSnapshot override { - emit log_named_string(_name(".delegateTo: "), operator.NAME()); + _logM("delegateTo", operator.NAME()); + // Create empty data ISignatureUtils.SignatureWithExpiry memory emptySig; uint256 expiry = type(uint256).max; @@ -414,69 +513,69 @@ contract User_AltMethods is User { } function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot override { - emit log(_name(".depositIntoEigenlayer")); + // emit log(_name(".depositIntoEigenlayer")); - uint256 expiry = type(uint256).max; - for (uint i = 0; i < strategies.length; i++) { - IStrategy strat = strategies[i]; - uint tokenBalance = tokenBalances[i]; + // uint256 expiry = type(uint256).max; + // for (uint i = 0; i < strategies.length; i++) { + // IStrategy strat = strategies[i]; + // uint tokenBalance = tokenBalances[i]; - if (strat == BEACONCHAIN_ETH_STRAT) { - // We're depositing via `eigenPodManager.stake`, which only accepts - // deposits of exactly 32 ether. - require(tokenBalance % 32 ether == 0, "User.depositIntoEigenlayer: balance must be multiple of 32 eth"); + // if (strat == BEACONCHAIN_ETH_STRAT) { + // // We're depositing via `eigenPodManager.stake`, which only accepts + // // deposits of exactly 32 ether. + // require(tokenBalance % 32 ether == 0, "User.depositIntoEigenlayer: balance must be multiple of 32 eth"); - // For each multiple of 32 ether, deploy a new validator to the same pod - uint numValidators = tokenBalance / 32 ether; - for (uint j = 0; j < numValidators; j++) { - eigenPodManager.stake{ value: 32 ether }("", "", bytes32(0)); - - (uint40 newValidatorIndex, CredentialsProofs memory proofs) = - beaconChain.newValidator({ - balanceWei: 32 ether, - withdrawalCreds: _podWithdrawalCredentials() - }); + // // For each multiple of 32 ether, deploy a new validator to the same pod + // uint numValidators = tokenBalance / 32 ether; + // for (uint j = 0; j < numValidators; j++) { + // eigenPodManager.stake{ value: 32 ether }("", "", bytes32(0)); + + // (uint40 newValidatorIndex, CredentialsProofs memory proofs) = + // beaconChain.newValidator({ + // balanceWei: 32 ether, + // withdrawalCreds: _podWithdrawalCredentials() + // }); - validators.push(newValidatorIndex); - - pod.verifyWithdrawalCredentials({ - beaconTimestamp: proofs.oracleTimestamp, - stateRootProof: proofs.stateRootProof, - validatorIndices: proofs.validatorIndices, - validatorFieldsProofs: proofs.validatorFieldsProofs, - validatorFields: proofs.validatorFields - }); - } - } else { - // Approve token - IERC20 underlyingToken = strat.underlyingToken(); - underlyingToken.approve(address(strategyManager), tokenBalance); - - // Get signature - uint256 nonceBefore = strategyManager.nonces(address(this)); - bytes32 structHash = keccak256( - abi.encode(strategyManager.DEPOSIT_TYPEHASH(), address(this), strat, underlyingToken, tokenBalance, nonceBefore, expiry) - ); - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", strategyManager.domainSeparator(), structHash)); - bytes memory signature = bytes(abi.encodePacked(digestHash)); // dummy sig data - - // Mark hash as signed - signedHashes[digestHash] = true; - - // Deposit - strategyManager.depositIntoStrategyWithSignature( - strat, - underlyingToken, - tokenBalance, - address(this), - expiry, - signature - ); - - // Mark hash as used - signedHashes[digestHash] = false; - } - } + // validators.push(newValidatorIndex); + + // pod.verifyWithdrawalCredentials({ + // beaconTimestamp: proofs.oracleTimestamp, + // stateRootProof: proofs.stateRootProof, + // validatorIndices: proofs.validatorIndices, + // validatorFieldsProofs: proofs.validatorFieldsProofs, + // validatorFields: proofs.validatorFields + // }); + // } + // } else { + // // Approve token + // IERC20 underlyingToken = strat.underlyingToken(); + // underlyingToken.approve(address(strategyManager), tokenBalance); + + // // Get signature + // uint256 nonceBefore = strategyManager.nonces(address(this)); + // bytes32 structHash = keccak256( + // abi.encode(strategyManager.DEPOSIT_TYPEHASH(), address(this), strat, underlyingToken, tokenBalance, nonceBefore, expiry) + // ); + // bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", strategyManager.domainSeparator(), structHash)); + // bytes memory signature = bytes(abi.encodePacked(digestHash)); // dummy sig data + + // // Mark hash as signed + // signedHashes[digestHash] = true; + + // // Deposit + // strategyManager.depositIntoStrategyWithSignature( + // strat, + // underlyingToken, + // tokenBalance, + // address(this), + // expiry, + // signature + // ); + + // // Mark hash as used + // signedHashes[digestHash] = false; + // } + // } } bytes4 internal constant MAGIC_VALUE = 0x1626ba7e; diff --git a/src/test/integration/users/User_M1.t.sol b/src/test/integration/users/User_M1.t.sol index c2f934130..3f914cfaf 100644 --- a/src/test/integration/users/User_M1.t.sol +++ b/src/test/integration/users/User_M1.t.sol @@ -41,7 +41,7 @@ contract User_M1 is User { IStrategy[] memory strategies, uint256[] memory tokenBalances ) public virtual createSnapshot { - emit log(_name(".depositIntoEigenlayer_M1")); + _logM("depositIntoEigenlayer_M1"); for (uint256 i = 0; i < strategies.length; i++) { IStrategy strat = strategies[i]; @@ -76,7 +76,7 @@ contract User_M1_AltMethods is User_M1 { IStrategy[] memory strategies, uint256[] memory tokenBalances ) public override createSnapshot { - emit log(_name(".depositIntoEigenlayer_M1_ALT")); + _logM(".depositIntoEigenlayer_M1_ALT"); uint256 expiry = type(uint256).max; for (uint256 i = 0; i < strategies.length; i++) { diff --git a/src/test/integration/utils/PrintUtils.t.sol b/src/test/integration/utils/PrintUtils.t.sol new file mode 100644 index 000000000..c80dd42ff --- /dev/null +++ b/src/test/integration/utils/PrintUtils.t.sol @@ -0,0 +1,119 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "forge-std/Test.sol"; + +import "@openzeppelin/contracts/utils/Strings.sol"; + +abstract contract PrintUtils is Test { + + using Strings for *; + using StdStyle for *; + + string constant HEADER_DELIMITER = "=================================================="; + string constant SECTION_DELIMITER = "======"; + + /// @dev Inheriting contracts implement this method + function NAME() public virtual view returns (string memory); + + function _logHeader(string memory key) internal { + emit log(HEADER_DELIMITER); + + emit log(key); + + emit log(HEADER_DELIMITER); + } + + function _logHeader(string memory key, address a) internal { + emit log(HEADER_DELIMITER); + + emit log_named_string(key.cyan(), a.yellow()); + // emit log_named_address(key.cyan(), a); + + emit log(HEADER_DELIMITER); + } + + function _logSection(string memory key) internal { + emit log(string.concat( + SECTION_DELIMITER, + key, + SECTION_DELIMITER + )); + } + + function _logSection(string memory key, address a) internal { + emit log(string.concat( + SECTION_DELIMITER, + key.cyan(), + ": ", + a.yellow().dim(), + SECTION_DELIMITER + )); + } + + function _logAction(string memory key, string memory action) internal { + emit log_named_string( + key.cyan(), + action.italic() + ); + } + + /// @dev Log method name + function _logM(string memory method) internal { + emit log(string.concat( + NAME().cyan(), + ".", + method.italic() + )); + } + + function _logM(string memory method, string memory arg) internal { + emit log(string.concat( + NAME().cyan(), + ".", + method.italic(), + ":", + arg + )); + } + + function _log(string memory s) internal { + emit log(s); + } + + function _logGreen(string memory s) internal { + emit log(s.green()); + } + + function _logGreen(string memory s, string memory value) internal { + emit log_named_string(s, value.green()); + } + + function _logYellow(string memory s, string memory value) internal { + emit log_named_string(s, value.yellow()); + } + + function _log(string memory key, string memory value) internal { + emit log_named_string(key, value); + } + + function _log(string memory key, uint value) internal { + emit log_named_uint(key, value); + } + + function _log(string memory key, address value) internal { + emit log_named_string(key, value.yellow()); + } + + function _logDim(string memory key, address value) internal { + emit log_named_string(key.dim(), value.yellow().dim()); + } + + function _log(string memory key, bytes32 value) internal { + emit log_named_string(key, value.dimBytes32()); + } + + function _log(string memory key, bool value) internal { + emit log_named_string(key, value ? "true".green() : "false".magenta()); + } +} \ No newline at end of file From 312534ac2f9e870d0b53c651ff11e316f9d17824 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Thu, 30 May 2024 20:02:10 +0000 Subject: [PATCH 13/85] feat: checkpoint proofs use balance container root * also refactors and cleans up BeaconChainProofs * more refactor/cleanup to come * chore: more proof library cleanup, removing unused constants * chore: additional cleanup and renaming of proof constants for consistency * chore: clean comments and reorganize constants --- src/contracts/interfaces/IEigenPod.sol | 6 +- src/contracts/libraries/BeaconChainProofs.sol | 356 +++++++++--------- src/contracts/pods/EigenPod.sol | 69 ++-- .../integration/mocks/BeaconChainMock.t.sol | 133 ++++--- src/test/integration/tests/Test.t.sol | 57 +++ src/test/integration/users/User.t.sol | 2 +- src/test/mocks/EigenPodMock.sol | 2 +- 7 files changed, 345 insertions(+), 280 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 936455a57..e3b1faa31 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -156,11 +156,11 @@ interface IEigenPod { * @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized. * (see `_updateCheckpoint` for more details) * @dev This method can only be called when there is a currently-active checkpoint. - * @param stateRootProof proves a beacon state root against the checkpoint's `beaconBlockRoot` - * @param proofs Proofs for one or more validator current balances against the `beaconStateRoot` + * @param balanceContainerProof proves the beacon's current balance container root against a checkpoint's `beaconBlockRoot` + * @param proofs Proofs for one or more validator current balances against the `balanceContainerRoot` */ function verifyCheckpointProofs( - BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceContainerProof calldata balanceContainerProof, BeaconChainProofs.BalanceProof[] calldata proofs ) external; diff --git a/src/contracts/libraries/BeaconChainProofs.sol b/src/contracts/libraries/BeaconChainProofs.sol index 68706ad47..526c45f1f 100644 --- a/src/contracts/libraries/BeaconChainProofs.sol +++ b/src/contracts/libraries/BeaconChainProofs.sol @@ -10,106 +10,126 @@ import "../libraries/Endian.sol"; //BeaconBlockHeader Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader //BeaconState Spec: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconstate library BeaconChainProofs { - // constants are the number of fields and the heights of the different merkle trees used in merkleizing beacon chain containers - uint256 internal constant BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT = 3; - uint256 internal constant BEACON_BLOCK_BODY_FIELD_TREE_HEIGHT = 4; - - uint256 internal constant BEACON_STATE_FIELD_TREE_HEIGHT = 5; - - uint256 internal constant VALIDATOR_FIELD_TREE_HEIGHT = 3; - - //Note: changed in the deneb hard fork from 4->5 - uint256 internal constant EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_DENEB = 5; - uint256 internal constant EXECUTION_PAYLOAD_HEADER_FIELD_TREE_HEIGHT_CAPELLA = 4; - - // SLOTS_PER_HISTORICAL_ROOT = 2**13, so tree height is 13 - uint256 internal constant BLOCK_ROOTS_TREE_HEIGHT = 13; - - //HISTORICAL_ROOTS_LIMIT = 2**24, so tree height is 24 - uint256 internal constant HISTORICAL_SUMMARIES_TREE_HEIGHT = 24; - - //Index of block_summary_root in historical_summary container - uint256 internal constant BLOCK_SUMMARY_ROOT_INDEX = 0; - - // tree height for hash tree of an individual withdrawal container - uint256 internal constant WITHDRAWAL_FIELD_TREE_HEIGHT = 2; - - uint256 internal constant VALIDATOR_TREE_HEIGHT = 40; - //refer to the eigenlayer-cli proof library. Despite being the same dimensions as the validator tree, the balance tree is merkleized differently + /// @notice Heights of various merkle trees in the beacon chain + /// - beaconBlockRoot + /// | HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT + /// -- beaconStateRoot + /// | HEIGHT: BEACON_STATE_TREE_HEIGHT + /// validatorContainerRoot, balanceContainerRoot + /// | | HEIGHT: BALANCE_TREE_HEIGHT + /// | individual balances + /// | HEIGHT: VALIDATOR_TREE_HEIGHT + /// individual validators + uint256 internal constant BEACON_BLOCK_HEADER_TREE_HEIGHT = 3; + uint256 internal constant BEACON_STATE_TREE_HEIGHT = 5; uint256 internal constant BALANCE_TREE_HEIGHT = 38; + uint256 internal constant VALIDATOR_TREE_HEIGHT = 40; + + /// @notice Index of the beaconStateRoot in the `BeaconBlockHeader` container + /// + /// BeaconBlockHeader = [..., state_root, ...] + /// 0... 3 + /// + /// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader) + uint256 internal constant STATE_ROOT_INDEX = 3; - // MAX_WITHDRAWALS_PER_PAYLOAD = 2**4, making tree height = 4 - uint256 internal constant WITHDRAWALS_TREE_HEIGHT = 4; - - //in beacon block body https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconblockbody - uint256 internal constant EXECUTION_PAYLOAD_INDEX = 9; + /// @notice Indices for fields in the `BeaconState` container + /// + /// BeaconState = [..., validators, balances, ...] + /// 0... 11 12 + /// + /// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconstate) + uint256 internal constant VALIDATOR_CONTAINER_INDEX = 11; + uint256 internal constant BALANCE_CONTAINER_INDEX = 12; - // in beacon block header https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beaconblockheader - uint256 internal constant SLOT_INDEX = 0; - uint256 internal constant STATE_ROOT_INDEX = 3; - uint256 internal constant BODY_ROOT_INDEX = 4; - // in beacon state https://github.com/ethereum/consensus-specs/blob/dev/specs/capella/beacon-chain.md#beaconstate - uint256 internal constant VALIDATOR_TREE_ROOT_INDEX = 11; - uint256 internal constant BALANCE_INDEX = 12; - uint256 internal constant HISTORICAL_SUMMARIES_INDEX = 27; + /// @notice Number of fields in the `Validator` container + /// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator) + uint256 internal constant VALIDATOR_FIELDS_LENGTH = 8; - // in validator https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator + /// @notice Indices for fields in the `Validator` container uint256 internal constant VALIDATOR_PUBKEY_INDEX = 0; uint256 internal constant VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX = 1; uint256 internal constant VALIDATOR_BALANCE_INDEX = 2; uint256 internal constant VALIDATOR_SLASHED_INDEX = 3; uint256 internal constant VALIDATOR_EXIT_EPOCH_INDEX = 6; - // in execution payload header - uint256 internal constant TIMESTAMP_INDEX = 9; - - //in execution payload - uint256 internal constant WITHDRAWALS_INDEX = 14; - - // in withdrawal - uint256 internal constant WITHDRAWAL_VALIDATOR_INDEX_INDEX = 1; - uint256 internal constant WITHDRAWAL_VALIDATOR_AMOUNT_INDEX = 3; - - //Misc Constants - - /// @notice The number of slots each epoch in the beacon chain - uint64 internal constant SLOTS_PER_EPOCH = 32; - - /// @notice The number of seconds in a slot in the beacon chain + /// @notice Slot/Epoch timings uint64 internal constant SECONDS_PER_SLOT = 12; - - /// @notice Number of seconds per epoch: 384 == 32 slots/epoch * 12 seconds/slot + uint64 internal constant SLOTS_PER_EPOCH = 32; uint64 internal constant SECONDS_PER_EPOCH = SLOTS_PER_EPOCH * SECONDS_PER_SLOT; - bytes8 internal constant UINT64_MASK = 0xffffffffffffffff; - + /// @notice `FAR_FUTURE_EPOCH` is used as the default value for certain `Validator` + /// fields when a `Validator` is first created on the beacon chain uint64 internal constant FAR_FUTURE_EPOCH = type(uint64).max; + bytes8 internal constant UINT64_MASK = 0xffffffffffffffff; - /// @notice This struct contains the root and proof for verifying the state root against the oracle block root + /// @notice Contains a beacon state root and a merkle proof verifying its inclusion under a beacon block root struct StateRootProof { bytes32 beaconStateRoot; bytes proof; } + /// @notice Contains a validator's fields and a merkle proof of their inclusion under a beacon state root + struct ValidatorProof { + bytes32[] validatorFields; + bytes proof; + } + + /// @notice Contains a beacon balance container root and a proof of this root under a beacon block root + struct BalanceContainerProof { + bytes32 balanceContainerRoot; + bytes proof; + } + + /// @notice Contains a validator balance root and a proof of its inclusion under a balance container root struct BalanceProof { bytes32 pubkeyHash; bytes32 balanceRoot; bytes proof; } - struct ValidatorProof { - bytes32[] validatorFields; - bytes proof; + /******************************************************************************* + VALIDATOR FIELDS -> BEACON STATE ROOT -> BEACON BLOCK ROOT + *******************************************************************************/ + + /// @notice Verify a merkle proof of the beacon state root against a beacon block root + /// @param beaconBlockRoot merkle root of the beacon block + /// @param proof the beacon state root and merkle proof of its inclusion under `beaconBlockRoot` + function verifyStateRoot( + bytes32 beaconBlockRoot, + StateRootProof calldata proof + ) internal view { + require( + proof.proof.length == 32 * (BEACON_BLOCK_HEADER_TREE_HEIGHT), + "BeaconChainProofs.verifyStateRoot: Proof has incorrect length" + ); + + /// This merkle proof verifies the `beaconStateRoot` under the `beaconBlockRoot` + /// - beaconBlockRoot + /// | HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT + /// -- beaconStateRoot + require( + Merkle.verifyInclusionSha256({ + proof: proof.proof, + root: beaconBlockRoot, + leaf: proof.beaconStateRoot, + index: STATE_ROOT_INDEX + }), + "BeaconChainProofs.verifyStateRoot: Invalid state root merkle proof" + ); } - /** - * @notice This function verifies merkle proofs of the fields of a certain validator against a beacon chain state root - * @param validatorIndex the index of the proven validator - * @param beaconStateRoot is the beacon chain state root to be proven against. - * @param validatorFieldsProof is the data used in proving the validator's fields - * @param validatorFields the claimed fields of the validator - */ + /// @notice Verify a merkle proof of a validator container against a `beaconStateRoot` + /// @dev This proof starts at a validator's container root, proves through the validator container root, + /// and continues proving to the root of the `BeaconState` + /// @dev See https://eth2book.info/capella/part3/containers/dependencies/#validator for info on `Validator` containers + /// @dev See https://eth2book.info/capella/part3/containers/state/#beaconstate for info on `BeaconState` containers + /// @param beaconStateRoot merkle root of the `BeaconState` container + /// @param validatorFields an individual validator's fields. These are merklized to form a `validatorRoot`, + /// which is used as the leaf to prove against `beaconStateRoot` + /// @param validatorFieldsProof a merkle proof of inclusion of `validatorFields` under `beaconStateRoot` + /// @param validatorIndex the validator's unique index function verifyValidatorFields( bytes32 beaconStateRoot, bytes32[] calldata validatorFields, @@ -117,23 +137,28 @@ library BeaconChainProofs { uint40 validatorIndex ) internal view { require( - validatorFields.length == 2 ** VALIDATOR_FIELD_TREE_HEIGHT, + validatorFields.length == VALIDATOR_FIELDS_LENGTH, "BeaconChainProofs.verifyValidatorFields: Validator fields has incorrect length" ); - /** - * Note: the length of the validator merkle proof is BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1. - * There is an additional layer added by hashing the root with the length of the validator list - */ + /// Note: the reason we use `VALIDATOR_TREE_HEIGHT + 1` here is because the merklization process for + /// this container includes hashing the root of the validator tree with the length of the validator list require( - validatorFieldsProof.length == 32 * ((VALIDATOR_TREE_HEIGHT + 1) + BEACON_STATE_FIELD_TREE_HEIGHT), + validatorFieldsProof.length == 32 * ((VALIDATOR_TREE_HEIGHT + 1) + BEACON_STATE_TREE_HEIGHT), "BeaconChainProofs.verifyValidatorFields: Proof has incorrect length" ); - uint256 index = (VALIDATOR_TREE_ROOT_INDEX << (VALIDATOR_TREE_HEIGHT + 1)) | uint256(validatorIndex); - // merkleize the validatorFields to get the leaf to prove + + // Merkleize `validatorFields` to get the leaf to prove bytes32 validatorRoot = Merkle.merkleizeSha256(validatorFields); - // verify the proof of the validatorRoot against the beaconStateRoot + /// This proof combines two proofs, so its index accounts for the relative position of leaves in two trees: + /// - beaconStateRoot + /// | HEIGHT: BEACON_STATE_TREE_HEIGHT + /// -- validatorContainerRoot + /// | HEIGHT: VALIDATOR_TREE_HEIGHT + 1 + /// ---- validatorRoot + uint256 index = (VALIDATOR_CONTAINER_INDEX << (VALIDATOR_TREE_HEIGHT + 1)) | uint256(validatorIndex); + require( Merkle.verifyInclusionSha256({ proof: validatorFieldsProof, @@ -145,77 +170,85 @@ library BeaconChainProofs { ); } + /******************************************************************************* + VALIDATOR BALANCE -> BALANCE CONTAINER ROOT -> BEACON BLOCK ROOT + *******************************************************************************/ + + /// @notice Verify a merkle proof of the beacon state's balances container against the beacon block root + /// @dev This proof starts at the balance container root, proves through the beacon state root, and + /// continues proving through the beacon block root. As a result, this proof will contain elements + /// of a `StateRootProof` under the same block root, with the addition of proving the balances field + /// within the beacon state. + /// @dev This is used to make checkpoint proofs more efficient, as a checkpoint will verify multiple balances + /// against the same balance container root. + /// @param beaconBlockRoot merkle root of the beacon block + /// @param proof a beacon balance container root and merkle proof of its inclusion under `beaconBlockRoot` + function verifyBalanceContainer( + bytes32 beaconBlockRoot, + BalanceContainerProof calldata proof + ) internal view { + require( + proof.proof.length == 32 * (BEACON_BLOCK_HEADER_TREE_HEIGHT + BEACON_STATE_TREE_HEIGHT), + "BeaconChainProofs.verifyBalanceContainer: Proof has incorrect length" + ); + + /// This proof combines two proofs, so its index accounts for the relative position of leaves in two trees: + /// - beaconBlockRoot + /// | HEIGHT: BEACON_BLOCK_HEADER_TREE_HEIGHT + /// -- beaconStateRoot + /// | HEIGHT: BEACON_STATE_TREE_HEIGHT + /// ---- balancesContainerRoot + uint256 index = (STATE_ROOT_INDEX << (BEACON_STATE_TREE_HEIGHT)) | BALANCE_CONTAINER_INDEX; + + require( + Merkle.verifyInclusionSha256({ + proof: proof.proof, + root: beaconBlockRoot, + leaf: proof.balanceContainerRoot, + index: index + }), + "BeaconChainProofs.verifyBalanceContainer: invalid balance container proof" + ); + } + + /// @notice Verify a merkle proof of a validator's balance against the beacon state's `balanceContainerRoot` + /// @param balanceContainerRoot the merkle root of all validators' current balances + /// @param validatorIndex the index of the validator whose balance we are proving + /// @param proof the validator's associated balance root and a merkle proof of inclusion under `balanceContainerRoot` + /// @return validatorBalanceGwei the validator's current balance (in gwei) function verifyValidatorBalance( - bytes32 beaconStateRoot, + bytes32 balanceContainerRoot, uint40 validatorIndex, BalanceProof calldata proof ) internal view returns (uint64 validatorBalanceGwei) { + /// Note: the reason we use `BALANCE_TREE_HEIGHT + 1` here is because the merklization process for + /// this container includes hashing the root of the balances tree with the length of the balances list require( - proof.proof.length == 32 * ((BALANCE_TREE_HEIGHT + 1) + BEACON_STATE_FIELD_TREE_HEIGHT), + proof.proof.length == 32 * (BALANCE_TREE_HEIGHT + 1), "BeaconChainProofs.verifyValidatorBalance: Proof has incorrect length" ); - // Beacon chain balances are lists of uint64 values which are grouped together in 4s when merkleized + /// When merkleized, beacon chain balances are combined into groups of 4 called a `balanceRoot`. The merkle + /// proof here verifies that this validator's `balanceRoot` is included in the `balanceContainerRoot` + /// - balanceContainerRoot + /// | HEIGHT: BALANCE_TREE_HEIGHT + /// -- balanceRoot uint256 balanceIndex = uint256(validatorIndex / 4); - /** - * Note: Merkleization of the balance root tree uses MerkleizeWithMixin, i.e., the length of the array is hashed with the root of - * the array. Thus we shift the BALANCE_INDEX over by BALANCE_TREE_HEIGHT + 1 and not just BALANCE_TREE_HEIGHT. - */ - balanceIndex = (BALANCE_INDEX << (BALANCE_TREE_HEIGHT + 1)) | balanceIndex; require( Merkle.verifyInclusionSha256({ proof: proof.proof, - root: beaconStateRoot, + root: balanceContainerRoot, leaf: proof.balanceRoot, index: balanceIndex }), "BeaconChainProofs.verifyValidatorBalance: Invalid merkle proof" ); + /// Extract the individual validator's balance from the `balanceRoot` return getBalanceAtIndex(proof.balanceRoot, validatorIndex); } - /** - * @notice This function verifies the latestBlockHeader against the state root. the latestBlockHeader is - * a tracked in the beacon state. - * @param beaconStateRoot is the beacon chain state root to be proven against. - * @param stateRootProof is the provided merkle proof - * @param latestBlockRoot is hashtree root of the latest block header in the beacon state - */ - function verifyStateRootAgainstLatestBlockRoot( - bytes32 latestBlockRoot, - bytes32 beaconStateRoot, - bytes calldata stateRootProof - ) internal view { - require( - stateRootProof.length == 32 * (BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT), - "BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot: Proof has incorrect length" - ); - //Next we verify the slot against the blockRoot - require( - Merkle.verifyInclusionSha256({ - proof: stateRootProof, - root: latestBlockRoot, - leaf: beaconStateRoot, - index: STATE_ROOT_INDEX - }), - "BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot: Invalid latest block header root merkle proof" - ); - } - - /** - * @notice This function replicates the ssz hashing of a validator's pubkey, outlined below: - * hh := ssz.NewHasher() - * hh.PutBytes(validatorPubkey[:]) - * validatorPubkeyHash := hh.Hash() - * hh.Reset() - */ - function hashValidatorBLSPubkey(bytes memory validatorPubkey) internal pure returns (bytes32 pubkeyHash) { - require(validatorPubkey.length == 48, "Input should be 48 bytes in length"); - return sha256(abi.encodePacked(validatorPubkey, bytes16(0))); - } - /** * @notice Parses a balanceRoot to get the uint64 balance of a validator. * @dev During merkleization of the beacon state balance tree, four uint64 values are treated as a single @@ -231,75 +264,44 @@ library BeaconChainProofs { Endian.fromLittleEndianUint64(bytes32((uint256(balanceRoot) << bitShiftAmount))); } - /** - * Indices for validator fields (refer to consensus specs): - * 0: pubkey - * 1: withdrawal credentials - * 2: effective balance - * 3: slashed? - * 4: activation elligibility epoch - * 5: activation epoch - * 6: exit epoch - * 7: withdrawable epoch - */ - - /** - * @dev Retrieves a validator's pubkey hash - */ + /// @notice Indices for fields in the `Validator` container: + /// 0: pubkey + /// 1: withdrawal credentials + /// 2: effective balance + /// 3: slashed? + /// 4: activation elligibility epoch + /// 5: activation epoch + /// 6: exit epoch + /// 7: withdrawable epoch + /// + /// (See https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator) + + /// @dev Retrieves a validator's pubkey hash function getPubkeyHash(bytes32[] memory validatorFields) internal pure returns (bytes32) { return validatorFields[VALIDATOR_PUBKEY_INDEX]; } + /// @dev Retrieves a validator's withdrawal credentials function getWithdrawalCredentials(bytes32[] memory validatorFields) internal pure returns (bytes32) { return validatorFields[VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX]; } - /** - * @dev Retrieves a validator's effective balance (in gwei) - */ + /// @dev Retrieves a validator's effective balance (in gwei) function getEffectiveBalanceGwei(bytes32[] memory validatorFields) internal pure returns (uint64) { return Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_BALANCE_INDEX]); } - /** - * @dev Returns true IFF the validator is marked slashed - */ + /// @dev Retrieves true IFF a validator is marked slashed function isValidatorSlashed(bytes32[] memory validatorFields) internal pure returns (bool) { return validatorFields[VALIDATOR_SLASHED_INDEX] != 0; } - /** - * @dev Retrieves a validator's exit epoch - */ + /// @dev Retrieves a validator's exit epoch function getExitEpoch(bytes32[] memory validatorFields) internal pure returns (uint64) { return Endian.fromLittleEndianUint64(validatorFields[VALIDATOR_EXIT_EPOCH_INDEX]); } - - /** - * Indices for withdrawal fields (refer to consensus specs): - * 0: withdrawal index - * 1: validator index - * 2: execution address - * 3: withdrawal amount - */ - - /** - * @dev Retrieves a withdrawal's validator index - */ - function getValidatorIndex(bytes32[] memory withdrawalFields) internal pure returns (uint40) { - return - uint40(Endian.fromLittleEndianUint64(withdrawalFields[WITHDRAWAL_VALIDATOR_INDEX_INDEX])); - } - - /** - * @dev Retrieves a withdrawal's withdrawal amount (in gwei) - */ - function getWithdrawalAmountGwei(bytes32[] memory withdrawalFields) internal pure returns (uint64) { - return - Endian.fromLittleEndianUint64(withdrawalFields[WITHDRAWAL_VALIDATOR_AMOUNT_INDEX]); - } } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 5ecfe23a0..31cb90d9b 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -43,10 +43,22 @@ contract EigenPod is CONSTANTS / IMMUTABLES *******************************************************************************/ - // @notice Internal constant used in calculations, since the beacon chain stores balances in Gwei rather than wei + /// @notice The beacon chain stores balances in Gwei, rather than wei. This value is used to convert between the two uint256 internal constant GWEI_TO_WEI = 1e9; - /// @notice This is the beacon chain deposit contract + /// @notice If a validator is slashed on the beacon chain and their balance has not been checkpointed + /// within `TIME_TILL_STALE_BALANCE` of the current block, `verifyStaleBalance` allows anyone to start + /// a checkpoint for the pod. + uint256 internal constant TIME_TILL_STALE_BALANCE = 2 weeks; + + /// @notice The address of the EIP-4788 beacon block root oracle + /// (See https://eips.ethereum.org/EIPS/eip-4788) + address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; + + /// @notice The length of the EIP-4788 beacon block root ring buffer + uint256 internal constant BEACON_ROOTS_HISTORY_BUFFER_LENGTH = 8191; + + /// @notice The beacon chain deposit contract IETHPOSDeposit public immutable ethPOS; /// @notice Contract used for withdrawal routing, to provide an extra "safety net" mechanism @@ -58,18 +70,6 @@ contract EigenPod is /// @notice This is the genesis time of the beacon state, to help us calculate conversions between slot and timestamp uint64 public immutable GENESIS_TIME; - /// @notice If a validator is slashed on the beacon chain and their balance has not been checkpointed - /// within `TIME_TILL_STALE_BALANCE` of the current block, they are eligible to be marked "stale" - /// via `verifyStaleBalance`. - uint256 internal constant TIME_TILL_STALE_BALANCE = 2 weeks; - - /// @notice The address of the EIP-4788 beacon block root oracle - /// (See https://eips.ethereum.org/EIPS/eip-4788) - address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; - - /// @notice The length of the EIP-4799 beacon block root ring buffer - uint256 internal constant BEACON_ROOTS_HISTORY_BUFFER_LENGTH = 8191; - /******************************************************************************* MODIFIERS *******************************************************************************/ @@ -180,11 +180,11 @@ contract EigenPod is * @dev If the checkpoint's `proofsRemaining` reaches 0, the checkpoint is finalized. * (see `_updateCheckpoint` for more details) * @dev This method can only be called when there is a currently-active checkpoint. - * @param stateRootProof proves a beacon state root against the checkpoint's `beaconBlockRoot` - * @param proofs Proofs for one or more validator current balances against the `beaconStateRoot` + * @param balanceContainerProof proves the beacon's current balance container root against a checkpoint's `beaconBlockRoot` + * @param proofs Proofs for one or more validator current balances against the `balanceContainerRoot` */ function verifyCheckpointProofs( - BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceContainerProof calldata balanceContainerProof, BeaconChainProofs.BalanceProof[] calldata proofs ) external @@ -198,11 +198,10 @@ contract EigenPod is Checkpoint memory checkpoint = _currentCheckpoint; - // Verify `stateRootProof` against `beaconBlockRoot` - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: checkpoint.beaconBlockRoot, - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof + // Verify `balanceContainerProof` against `beaconBlockRoot` + BeaconChainProofs.verifyBalanceContainer({ + beaconBlockRoot: checkpoint.beaconBlockRoot, + proof: balanceContainerProof }); // Process each checkpoint proof submitted @@ -234,7 +233,7 @@ contract EigenPod is int256 balanceDeltaGwei = _verifyCheckpointProof({ validatorInfo: validatorInfo, beaconTimestamp: beaconTimestamp, - beaconStateRoot: stateRootProof.beaconStateRoot, + balanceContainerRoot: balanceContainerProof.balanceContainerRoot, proof: proofs[i] }); @@ -283,11 +282,10 @@ contract EigenPod is "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" ); - // Verify passed-in beaconStateRoot against oracle-provided block root: - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: _getParentBlockRoot(beaconTimestamp), - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof + // Verify passed-in `beaconStateRoot` against the beacon block root + BeaconChainProofs.verifyStateRoot({ + beaconBlockRoot: _getParentBlockRoot(beaconTimestamp), + proof: stateRootProof }); uint256 totalAmountToBeRestakedWei; @@ -351,11 +349,10 @@ contract EigenPod is "EigenPod.verifyStaleBalance: validator must be slashed to be marked stale" ); - // Verify `beaconStateRoot` against beacon block root - BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot({ - latestBlockRoot: _getParentBlockRoot(beaconTimestamp), - beaconStateRoot: stateRootProof.beaconStateRoot, - stateRootProof: stateRootProof.proof + // Verify passed-in `beaconStateRoot` against the beacon block root + BeaconChainProofs.verifyStateRoot({ + beaconBlockRoot: _getParentBlockRoot(beaconTimestamp), + proof: stateRootProof }); // Verify Validator container proof against `beaconStateRoot` @@ -504,15 +501,15 @@ contract EigenPod is function _verifyCheckpointProof( ValidatorInfo memory validatorInfo, uint64 beaconTimestamp, - bytes32 beaconStateRoot, + bytes32 balanceContainerRoot, BeaconChainProofs.BalanceProof calldata proof ) internal returns (int256 balanceDeltaGwei) { uint40 validatorIndex = uint40(validatorInfo.validatorIndex); - // Verify validator balance against beaconStateRoot + // Verify validator balance against `balanceContainerRoot` uint64 prevBalanceGwei = validatorInfo.restakedBalanceGwei; uint64 newBalanceGwei = BeaconChainProofs.verifyValidatorBalance({ - beaconStateRoot: beaconStateRoot, + balanceContainerRoot: balanceContainerRoot, validatorIndex: validatorIndex, proof: proof }); diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 3125c7317..2bec206c1 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -22,7 +22,7 @@ struct BalanceRootProof { } struct CheckpointProofs { - BeaconChainProofs.StateRootProof stateRootProof; + BeaconChainProofs.BalanceContainerProof balanceContainerProof; BeaconChainProofs.BalanceProof[] balanceProofs; } @@ -60,13 +60,14 @@ contract BeaconChainMock is PrintUtils { // see https://eth2book.info/capella/part3/containers/blocks/#beaconblock uint constant BEACON_BLOCK_FIELDS = 5; - uint immutable BLOCKROOT_PROOF_LEN = 32 * BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT; + uint immutable BLOCKROOT_PROOF_LEN = 32 * BeaconChainProofs.BEACON_BLOCK_HEADER_TREE_HEIGHT; uint immutable VAL_FIELDS_PROOF_LEN = 32 * ( - (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT + (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_TREE_HEIGHT ); - uint immutable BALANCE_PROOF_LEN = 32 * ( - (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1) + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT + uint immutable BALANCE_CONTAINER_PROOF_LEN = 32 * ( + BeaconChainProofs.BEACON_BLOCK_HEADER_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_TREE_HEIGHT ); + uint immutable BALANCE_PROOF_LEN = 32 * (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1); uint64 genesisTime; uint64 public nextTimestamp; @@ -103,6 +104,9 @@ contract BeaconChainMock is PrintUtils { // Maps block.timestamp -> beacon state root and proof mapping(uint64 => BeaconChainProofs.StateRootProof) stateRootProofs; + // Maps block.timestamp -> balance container root and proof + mapping(uint64 => BeaconChainProofs.BalanceContainerProof) balanceContainerProofs; + // Maps block.timestamp -> validatorIndex -> credential proof for that timestamp mapping(uint64 => mapping(uint40 => ValidatorFieldsProof)) validatorFieldsProofs; @@ -328,23 +332,21 @@ contract BeaconChainMock is PrintUtils { } _log("- updated effective balances"); - _log("- jumping to next epoch:"); // Move forward one epoch - _log("-- current time", block.timestamp); + // _log("-- current time", block.timestamp); _log("-- current epoch", currentEpoch()); uint64 curEpoch = currentEpoch(); cheats.warp(_nextEpochStartTimestamp(curEpoch)); curTimestamp = uint64(block.timestamp); - _log("-- new time", block.timestamp); - _log("-- new epoch", currentEpoch()); + // _log("-- new time", block.timestamp); + _log("- jumped to next epoch", currentEpoch()); - _log("- updating beacon state"); + _log("- building beacon state trees"); // Log total number of validators and number being processed for the first time - _log("-- total num validators", validators.length); lastIndexProcessed = validators.length - 1; // Build merkle tree for validators @@ -356,17 +358,17 @@ contract BeaconChainMock is PrintUtils { // _log("-- validator container root", validatorsRoot); // Build merkle tree for current balances - bytes32 balancesRoot = _buildMerkleTree({ + bytes32 balanceContainerRoot = _buildMerkleTree({ leaves: _getBalanceLeaves(), treeHeight: BeaconChainProofs.BALANCE_TREE_HEIGHT + 1, tree: trees[curTimestamp].balancesTree }); - // _log("-- balances container root", balancesRoot); + // _log("-- balances container root", balanceContainerRoot); // Build merkle tree for BeaconState bytes32 beaconStateRoot = _buildMerkleTree({ - leaves: _getBeaconStateLeaves(validatorsRoot, balancesRoot), - treeHeight: BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT, + leaves: _getBeaconStateLeaves(validatorsRoot, balanceContainerRoot), + treeHeight: BeaconChainProofs.BEACON_STATE_TREE_HEIGHT, tree: trees[curTimestamp].stateTree }); // _log("-- beacon state root", beaconStateRoot); @@ -374,7 +376,7 @@ contract BeaconChainMock is PrintUtils { // Build merkle tree for BeaconBlock bytes32 beaconBlockRoot = _buildMerkleTree({ leaves: _getBeaconBlockLeaves(beaconStateRoot), - treeHeight: BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT, + treeHeight: BeaconChainProofs.BEACON_BLOCK_HEADER_TREE_HEIGHT, tree: trees[curTimestamp].blockTree }); _log("-- beacon block root", beaconBlockRoot); @@ -384,6 +386,7 @@ contract BeaconChainMock is PrintUtils { // Pre-generate proofs to pass to EigenPod methods _genStateRootProof(beaconStateRoot); + _genBalanceContainerProof(balanceContainerRoot); _genCredentialProofs(); _genBalanceProofs(); } @@ -507,7 +510,8 @@ contract BeaconChainMock is PrintUtils { bytes memory proof = new bytes(BLOCKROOT_PROOF_LEN); bytes32 curNode = beaconStateRoot; - for (uint i = 0; i < BeaconChainProofs.BEACON_BLOCK_HEADER_FIELD_TREE_HEIGHT; i++) { + uint depth = 0; + for (uint i = 0; i < BeaconChainProofs.BEACON_BLOCK_HEADER_TREE_HEIGHT; i++) { bytes32 sibling = trees[curTimestamp].blockTree.siblings[curNode]; // proof[j] = sibling; @@ -519,6 +523,7 @@ contract BeaconChainMock is PrintUtils { } curNode = trees[curTimestamp].blockTree.parents[curNode]; + depth++; } stateRootProofs[curTimestamp] = BeaconChainProofs.StateRootProof({ @@ -527,6 +532,48 @@ contract BeaconChainMock is PrintUtils { }); } + function _genBalanceContainerProof(bytes32 balanceContainerRoot) internal { + bytes memory proof = new bytes(BALANCE_CONTAINER_PROOF_LEN); + bytes32 curNode = balanceContainerRoot; + + uint totalHeight = BALANCE_CONTAINER_PROOF_LEN / 32; + uint depth = 0; + for (uint i = 0; i < BeaconChainProofs.BEACON_STATE_TREE_HEIGHT; i++) { + bytes32 sibling = trees[curTimestamp].stateTree.siblings[curNode]; + + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, i))), + sibling + ) + } + + curNode = trees[curTimestamp].stateTree.parents[curNode]; + depth++; + } + + for (uint i = depth; i < totalHeight; i++) { + bytes32 sibling = trees[curTimestamp].blockTree.siblings[curNode]; + + // proof[j] = sibling; + assembly { + mstore( + add(proof, add(32, mul(32, i))), + sibling + ) + } + + curNode = trees[curTimestamp].blockTree.parents[curNode]; + depth++; + } + + balanceContainerProofs[curTimestamp] = BeaconChainProofs.BalanceContainerProof({ + balanceContainerRoot: balanceContainerRoot, + proof: proof + }); + } + function _genCredentialProofs() internal { mapping(uint40 => ValidatorFieldsProof) storage vfProofs = validatorFieldsProofs[curTimestamp]; @@ -557,7 +604,7 @@ contract BeaconChainMock is PrintUtils { // Validator container root -> beacon state root for ( uint j = depth; - j < 1 + BeaconChainProofs.VALIDATOR_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT; + j < 1 + BeaconChainProofs.VALIDATOR_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_TREE_HEIGHT; j++ ) { bytes32 sibling = trees[curTimestamp].stateTree.siblings[curNode]; @@ -571,17 +618,9 @@ contract BeaconChainMock is PrintUtils { } curNode = trees[curTimestamp].stateTree.parents[curNode]; + depth++; } - // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - // proof: proof, - // leaf: Merkle.merkleizeSha256(validatorFields), - // index: _calcValProofIndex(uint40(i)) - // }); - - // emit log_named_uint("proof for validator", i); - // emit log_named_bytes32("calculated beacon state root", beaconStateRoot); - vfProofs[uint40(i)].validatorFields = validatorFields; vfProofs[uint40(i)].validatorFieldsProof = proof; } @@ -615,36 +654,6 @@ contract BeaconChainMock is PrintUtils { depth++; } - // balances container root -> beacon state root - for ( - uint j = depth; - j < 1 + BeaconChainProofs.BALANCE_TREE_HEIGHT + BeaconChainProofs.BEACON_STATE_FIELD_TREE_HEIGHT; - j++ - ) { - bytes32 sibling = trees[curTimestamp].stateTree.siblings[curNode]; - - // proof[j] = sibling; - assembly { - mstore( - add(proof, add(32, mul(32, j))), - sibling - ) - } - - curNode = trees[curTimestamp].stateTree.parents[curNode]; - } - - // emit log("==="); - - // bytes32 beaconStateRoot = Merkle.processInclusionProofSha256({ - // proof: proof, - // leaf: balanceRoot, - // index: _calcBalanceProofIndex(uint40(i)) - // }); - - // emit log_named_uint("proof for balance root", i); - // emit log_named_bytes32("calculated beacon state root", beaconStateRoot); - brProofs[uint40(i)].balanceRoot = balanceRoot; brProofs[uint40(i)].proof = proof; } @@ -689,8 +698,8 @@ contract BeaconChainMock is PrintUtils { } // Place validatorsRoot and balancesRoot into tree - leaves[BeaconChainProofs.VALIDATOR_TREE_ROOT_INDEX] = validatorsRoot; - leaves[BeaconChainProofs.BALANCE_INDEX] = balancesRoot; + leaves[BeaconChainProofs.VALIDATOR_CONTAINER_INDEX] = validatorsRoot; + leaves[BeaconChainProofs.BALANCE_CONTAINER_INDEX] = balancesRoot; return leaves; } @@ -770,13 +779,13 @@ contract BeaconChainMock is PrintUtils { function _calcValProofIndex(uint40 validatorIndex) internal pure returns (uint) { return - (BeaconChainProofs.VALIDATOR_TREE_ROOT_INDEX << (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1)) | + (BeaconChainProofs.VALIDATOR_CONTAINER_INDEX << (BeaconChainProofs.VALIDATOR_TREE_HEIGHT + 1)) | uint(validatorIndex); } function _calcBalanceProofIndex(uint40 balanceRootIndex) internal pure returns (uint) { return - (BeaconChainProofs.BALANCE_INDEX << (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1)) | + (BeaconChainProofs.BALANCE_CONTAINER_INDEX << (BeaconChainProofs.BALANCE_TREE_HEIGHT + 1)) | uint(balanceRootIndex); } @@ -872,7 +881,7 @@ contract BeaconChainMock is PrintUtils { } CheckpointProofs memory proofs = CheckpointProofs({ - stateRootProof: stateRootProofs[curTimestamp], + balanceContainerProof: balanceContainerProofs[curTimestamp], balanceProofs: new BeaconChainProofs.BalanceProof[](_validators.length) }); diff --git a/src/test/integration/tests/Test.t.sol b/src/test/integration/tests/Test.t.sol index 01f4c58c9..6199872fd 100644 --- a/src/test/integration/tests/Test.t.sol +++ b/src/test/integration/tests/Test.t.sol @@ -11,6 +11,63 @@ contract Integration_Tester is IntegrationCheckUtils { string constant SECTION_DELIMITER = "======"; + function test_GasMetering() public { + _configRand({ + _randomSeed: 24, + _assetTypes: HOLDS_ETH, + _userTypes: DEFAULT + }); + + (User staker, ,) = _newRandomStaker(); + cheats.pauseGasMetering(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + cheats.startPrank(address(staker)); + cheats.resumeGasMetering(); + + uint startGas = gasleft(); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + uint endGas = gasleft(); + cheats.pauseGasMetering(); + uint totalGas = startGas - endGas; + emit log_named_uint("== num validators", validators.length); + emit log_named_uint("== verifyWC gas", totalGas); + + // check_VerifyWC_State(staker, validators, beaconBalanceWei); + + beaconChain.advanceEpoch(); + // check pod balances have increased + + staker.startCheckpoint(); + // check_StartCheckpoint_State(staker); + + CheckpointProofs memory cpProofs = beaconChain.getCheckpointProofs(validators); + + cheats.resumeGasMetering(); + startGas = gasleft(); + pod.verifyCheckpointProofs({ + balanceContainerProof: cpProofs.balanceContainerProof, + proofs: cpProofs.balanceProofs + }); + endGas = gasleft(); + cheats.pauseGasMetering(); + totalGas = startGas - endGas; + emit log_named_uint("== checkpoint gas", totalGas); + + // check_CompleteCheckpoint_State(staker); + // revert(); + } + /******************************************************************************* VERIFY -> START/COMPLETE CHECKPOINT *******************************************************************************/ diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index fddc8886c..163b86f4f 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -310,7 +310,7 @@ contract User is PrintUtils { _log("- submitting num checkpoint proofs", proofs.balanceProofs.length); pod.verifyCheckpointProofs({ - stateRootProof: proofs.stateRootProof, + balanceContainerProof: proofs.balanceContainerProof, proofs: proofs.balanceProofs }); } diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol index 57351f7ef..e0250298f 100644 --- a/src/test/mocks/EigenPodMock.sol +++ b/src/test/mocks/EigenPodMock.sol @@ -58,7 +58,7 @@ contract EigenPodMock is IEigenPod, Test { function startCheckpoint(bool revertIfNoBalance) external {} function verifyCheckpointProofs( - BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.BalanceContainerProof calldata balanceContainerProof, BeaconChainProofs.BalanceProof[] calldata proofs ) external {} From 0c8763e895db48f049d9cd5da7f319425518e580 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 31 May 2024 14:53:32 +0000 Subject: [PATCH 14/85] chore: remove delayedWithdrawalRouter from EigenPod --- script/deploy/devnet/M2_Deploy_From_Scratch.s.sol | 5 ----- script/deploy/goerli/GoerliUpgrade1.s.sol | 1 - script/deploy/goerli/GoerliUpgrade2.s.sol | 1 - script/deploy/holesky/M2_Deploy_From_Scratch.s.sol | 1 - script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol | 5 ----- script/deploy/mainnet/M1_Deploy.s.sol | 5 ----- script/deploy/mainnet/M2Deploy.s.sol | 2 -- script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 1 - src/contracts/pods/EigenPod.sol | 5 ----- src/test/DepositWithdraw.t.sol | 2 +- src/test/EigenLayerDeployer.t.sol | 2 -- src/test/EigenPod.t.sol | 2 -- src/test/harnesses/EigenPodHarness.sol | 2 -- src/test/integration/IntegrationDeployer.t.sol | 4 ---- src/test/unit/EigenPod-PodManagerUnit.t.sol | 1 - src/test/unit/EigenPodUnit.t.sol | 3 --- 16 files changed, 1 insertion(+), 41 deletions(-) diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index b7fad3f7b..06e438efb 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -185,7 +185,6 @@ contract Deployer_M2 is Script, Test { } eigenPodImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME ); @@ -584,10 +583,6 @@ contract Deployer_M2 is Script, Test { eigenPodImplementation.eigenPodManager() == eigenPodManager, " eigenPodImplementation: eigenPodManager contract address not set correctly" ); - require( - eigenPodImplementation.delayedWithdrawalRouter() == delayedWithdrawalRouter, - " eigenPodImplementation: delayedWithdrawalRouter contract address not set correctly" - ); string memory config_data = vm.readFile(deployConfigPath); for (uint i = 0; i < deployedStrategyArray.length; i++) { diff --git a/script/deploy/goerli/GoerliUpgrade1.s.sol b/script/deploy/goerli/GoerliUpgrade1.s.sol index e8ae0d0ef..c64eb8e2f 100644 --- a/script/deploy/goerli/GoerliUpgrade1.s.sol +++ b/script/deploy/goerli/GoerliUpgrade1.s.sol @@ -70,7 +70,6 @@ contract GoerliUpgrade1 is Script, Test { address eigenPodImplementation = address( new EigenPod( IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), - delayedWithdrawalRouter, eigenPodManager, 1616508000 ) diff --git a/script/deploy/goerli/GoerliUpgrade2.s.sol b/script/deploy/goerli/GoerliUpgrade2.s.sol index 331a2b425..b64af6efb 100644 --- a/script/deploy/goerli/GoerliUpgrade2.s.sol +++ b/script/deploy/goerli/GoerliUpgrade2.s.sol @@ -89,7 +89,6 @@ contract GoerliUpgrade2 is Script, Test { address eigenPodImplementation = address( new EigenPod( IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), - delayedWithdrawalRouter, eigenPodManager, 1616508000 ) diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index a29fa93b8..97af355b7 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -74,7 +74,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( IETHPOSDeposit(ETHPOSDepositAddress), - delayedWithdrawalRouter, eigenPodManager, EIGENPOD_GENESIS_TIME ); diff --git a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol index 0d744f931..f46bc2e88 100644 --- a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol +++ b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol @@ -85,7 +85,6 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { genesisTimeBefore = EigenPod(payable(eigenPodBeacon.implementation())).GENESIS_TIME(); // maxRestakedBalanceBefore = EigenPod(payable(eigenPodBeacon.implementation())).MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(); - delayedWithdrawalRouter = EigenPod(payable(eigenPodBeacon.implementation())).delayedWithdrawalRouter(); // Begin deployment vm.startBroadcast(); @@ -93,7 +92,6 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { // Deploy new implmementation contracts eigenPodImplementation = new EigenPod({ _ethPOS: ethPOS, - _delayedWithdrawalRouter: delayedWithdrawalRouter, _eigenPodManager: eigenPodManager, // _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR: maxRestakedBalanceBefore, _GENESIS_TIME: genesisTimeBefore @@ -143,8 +141,6 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { // Check that state is correct require(eigenPodBeacon.implementation() == address(eigenPodImplementation), "implementation set incorrectly"); - require(eigenPodImplementation.delayedWithdrawalRouter() == delayedWithdrawalRouter, - "delayedWithdrawalRouter set incorrectly"); require(eigenPodImplementation.ethPOS() == ethPOS, "ethPOS set incorrectly"); require(eigenPodImplementation.eigenPodManager() == eigenPodManager, @@ -161,7 +157,6 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { "GENESIS_TIME set incorrectly"); - require(address(EigenPod(payable(eigenPodBeacon.implementation())).delayedWithdrawalRouter()) == 0x7Fe7E9CC0F274d2435AD5d56D5fa73E47F6A23D8); require(address(EigenPod(payable(eigenPodBeacon.implementation())).eigenPodManager()) == 0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338); require(address(EigenPod(payable(eigenPodBeacon.implementation())).ethPOS()) == 0x00000000219ab540356cBB839Cbe05303d7705Fa); } diff --git a/script/deploy/mainnet/M1_Deploy.s.sol b/script/deploy/mainnet/M1_Deploy.s.sol index 4117604e3..dea4f9781 100644 --- a/script/deploy/mainnet/M1_Deploy.s.sol +++ b/script/deploy/mainnet/M1_Deploy.s.sol @@ -181,7 +181,6 @@ contract Deployer_M1 is Script, Test { } eigenPodImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME ); @@ -557,10 +556,6 @@ contract Deployer_M1 is Script, Test { eigenPodImplementation.eigenPodManager() == eigenPodManager, " eigenPodImplementation: eigenPodManager contract address not set correctly" ); - require( - eigenPodImplementation.delayedWithdrawalRouter() == delayedWithdrawalRouter, - " eigenPodImplementation: delayedWithdrawalRouter contract address not set correctly" - ); string memory config_data = vm.readFile(deployConfigPath); for (uint i = 0; i < deployedStrategyArray.length; i++) { diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index a0f91fa4b..c45e3e045 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -113,7 +113,6 @@ contract M2Deploy is Script, Test { strategyWhitelister = strategyManager.strategyWhitelister(); delegationManagerDomainSeparator = IDelegationManagerV0(address(delegation)).DOMAIN_SEPARATOR(); numPods = eigenPodManager.numPods(); - delayedWithdrawalRouter = EigenPod(payable(eigenPodBeacon.implementation())).delayedWithdrawalRouter(); // Set chain-specific values IStrategy[] memory strategyArray = new IStrategy[](1); @@ -159,7 +158,6 @@ contract M2Deploy is Script, Test { ); eigenPodImplementation = new EigenPod({ _ethPOS: ethPOS, - _delayedWithdrawalRouter: delayedWithdrawalRouter, _eigenPodManager: eigenPodManager, _GENESIS_TIME: 1616508000 }); diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index 27ef74b13..0664f89f0 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -64,7 +64,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { // 2. Deploy Implementations eigenPodImplementation = new EigenPod( IETHPOSDeposit(ETHPOSDepositAddress), - delayedWithdrawalRouter, eigenPodManager, EIGENPOD_GENESIS_TIME ); diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 31cb90d9b..e00b02a72 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -61,9 +61,6 @@ contract EigenPod is /// @notice The beacon chain deposit contract IETHPOSDeposit public immutable ethPOS; - /// @notice Contract used for withdrawal routing, to provide an extra "safety net" mechanism - IDelayedWithdrawalRouter public immutable delayedWithdrawalRouter; - /// @notice The single EigenPodManager for EigenLayer IEigenPodManager public immutable eigenPodManager; @@ -118,12 +115,10 @@ contract EigenPod is constructor( IETHPOSDeposit _ethPOS, - IDelayedWithdrawalRouter _delayedWithdrawalRouter, IEigenPodManager _eigenPodManager, uint64 _GENESIS_TIME ) { ethPOS = _ethPOS; - delayedWithdrawalRouter = _delayedWithdrawalRouter; eigenPodManager = _eigenPodManager; GENESIS_TIME = _GENESIS_TIME; _disableInitializers(); diff --git a/src/test/DepositWithdraw.t.sol b/src/test/DepositWithdraw.t.sol index b29e63d47..3d8a0f133 100644 --- a/src/test/DepositWithdraw.t.sol +++ b/src/test/DepositWithdraw.t.sol @@ -367,7 +367,7 @@ contract DepositWithdrawTests is EigenLayerTestHelper { ); ethPOSDeposit = new ETHPOSDepositMock(); - pod = new EigenPod(ethPOSDeposit, delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME); + pod = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME); eigenPodBeacon = new UpgradeableBeacon(address(pod)); diff --git a/src/test/EigenLayerDeployer.t.sol b/src/test/EigenLayerDeployer.t.sol index f55df602a..6fc445380 100644 --- a/src/test/EigenLayerDeployer.t.sol +++ b/src/test/EigenLayerDeployer.t.sol @@ -167,7 +167,6 @@ contract EigenLayerDeployer is Operators { ethPOSDeposit = new ETHPOSDepositMock(); pod = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME ); @@ -240,7 +239,6 @@ contract EigenLayerDeployer is Operators { ethPOSDeposit = new ETHPOSDepositMock(); pod = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GOERLI_GENESIS_TIME ); diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index 1621566a6..35826bf62 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -160,7 +160,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ethPOSDeposit = new ETHPOSDepositMock(); podImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, IEigenPodManager(podManagerAddress), GOERLI_GENESIS_TIME ); @@ -1835,7 +1834,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { function _deployInternalFunctionTester() internal { podInternalFunctionTester = new EPInternalFunctions( ethPOSDeposit, - delayedWithdrawalRouter, IEigenPodManager(podManagerAddress), GOERLI_GENESIS_TIME ); diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 92746ddd2..229dbbc0e 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -8,12 +8,10 @@ contract EPInternalFunctions is EigenPod, Test { constructor( IETHPOSDeposit _ethPOS, - IDelayedWithdrawalRouter _delayedWithdrawalRouter, IEigenPodManager _eigenPodManager, uint64 _GENESIS_TIME ) EigenPod( _ethPOS, - _delayedWithdrawalRouter, _eigenPodManager, _GENESIS_TIME ) {} diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 401202959..f94e8f869 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -251,7 +251,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GENESIS_TIME_LOCAL ); @@ -383,7 +382,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, GENESIS_TIME_MAINNET ); @@ -488,7 +486,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( ethPOSDeposit, - delayedWithdrawalRouter, eigenPodManager, 0 ); @@ -704,7 +701,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ethPOSDeposit = new ETHPOSDepositMock(); eigenPodImplementation = new EigenPod( ethPOSDeposit, - eigenPodImplementation.delayedWithdrawalRouter(), eigenPodImplementation.eigenPodManager(), 0 ); diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol index bae07413f..c8f346bda 100644 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ b/src/test/unit/EigenPod-PodManagerUnit.t.sol @@ -63,7 +63,6 @@ contract EigenPod_PodManager_UnitTests is EigenLayerUnitTestSetup { // Deploy EigenPod Implementation and beacon podImplementation = new EigenPod( ethPOSMock, - delayedWithdrawalRouterMock, eigenPodManager, GOERLI_GENESIS_TIME ); diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 0e74b61da..c2b83b3d7 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -50,7 +50,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { // Deploy EigenPod podImplementation = new EigenPod( ethPOSDepositMock, - delayedWithdrawalRouterMock, eigenPodManagerMock, GOERLI_GENESIS_TIME ); @@ -99,7 +98,6 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests, IEigenPodEvents assertTrue(eigenPod.hasRestaked(), "hasRestaked incorrectly set"); // Check immutable storage assertEq(address(eigenPod.ethPOS()), address(ethPOSDepositMock), "EthPOS incorrectly set"); - assertEq(address(eigenPod.delayedWithdrawalRouter()), address(delayedWithdrawalRouterMock), "DelayedWithdrawalRouter incorrectly set"); assertEq(address(eigenPod.eigenPodManager()), address(eigenPodManagerMock), "EigenPodManager incorrectly set"); assertEq(eigenPod.GENESIS_TIME(), GOERLI_GENESIS_TIME, "Goerli genesis time incorrectly set"); } @@ -374,7 +372,6 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { // Deploy EP Harness eigenPodHarnessImplementation = new EPInternalFunctions( ethPOSDepositMock, - delayedWithdrawalRouterMock, eigenPodManagerMock, GOERLI_GENESIS_TIME ); From 04a9802d3351c2e836517a5c7c8acb41d2d6fa1e Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 31 May 2024 15:54:31 +0000 Subject: [PATCH 15/85] feat: adjust storage sizes for fields in checkpoint struct --- src/contracts/interfaces/IEigenPod.sol | 6 +++--- src/contracts/pods/EigenPod.sol | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index e3b1faa31..c1b45097d 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -41,9 +41,9 @@ interface IEigenPod { struct Checkpoint { bytes32 beaconBlockRoot; - uint256 podBalanceGwei; - int256 balanceDeltasGwei; - uint256 proofsRemaining; + uint24 proofsRemaining; + uint64 podBalanceGwei; + int128 balanceDeltasGwei; } /// @notice Emitted when an ETH validator stakes via this eigenPod diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index e00b02a72..f9d8a7ec0 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -225,7 +225,7 @@ contract EigenPod is // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. // The assumption is that if this is the case, any withdrawn ETH was already in // the pod when `startCheckpoint` was originally called. - int256 balanceDeltaGwei = _verifyCheckpointProof({ + int128 balanceDeltaGwei = _verifyCheckpointProof({ validatorInfo: validatorInfo, beaconTimestamp: beaconTimestamp, balanceContainerRoot: balanceContainerProof.balanceContainerRoot, @@ -498,7 +498,7 @@ contract EigenPod is uint64 beaconTimestamp, bytes32 balanceContainerRoot, BeaconChainProofs.BalanceProof calldata proof - ) internal returns (int256 balanceDeltaGwei) { + ) internal returns (int128 balanceDeltaGwei) { uint40 validatorIndex = uint40(validatorInfo.validatorIndex); // Verify validator balance against `balanceContainerRoot` @@ -563,8 +563,8 @@ contract EigenPod is // `podBalanceGwei` is also converted to a gwei amount here. This means that any sub-gwei amounts // sent to the pod are not credited with shares and are therefore not withdrawable. // This can be addressed by topping up a pod's balance to a value divisible by 1 gwei. - uint256 podBalanceGwei = - (address(this).balance / GWEI_TO_WEI) - withdrawableRestakedExecutionLayerGwei; + uint64 podBalanceGwei = + uint64(address(this).balance / GWEI_TO_WEI) - withdrawableRestakedExecutionLayerGwei; // If the caller doesn't want a "0 balance" checkpoint, revert if (revertIfNoBalance && podBalanceGwei == 0) { @@ -576,9 +576,9 @@ contract EigenPod is // the checkpoint. Checkpoint memory checkpoint = Checkpoint({ beaconBlockRoot: _getParentBlockRoot(uint64(block.timestamp)), + proofsRemaining: uint24(activeValidatorCount), podBalanceGwei: podBalanceGwei, - balanceDeltasGwei: 0, - proofsRemaining: activeValidatorCount + balanceDeltasGwei: 0 }); // Place checkpoint in storage. If `proofsRemaining` is 0, the checkpoint @@ -600,11 +600,11 @@ contract EigenPod is function _updateCheckpoint(Checkpoint memory checkpoint) internal { if (checkpoint.proofsRemaining == 0) { int256 totalShareDeltaWei = - (int256(checkpoint.podBalanceGwei) + checkpoint.balanceDeltasGwei) * int256(GWEI_TO_WEI); + (int128(uint128(checkpoint.podBalanceGwei)) + checkpoint.balanceDeltasGwei) * int256(GWEI_TO_WEI); // Add any native ETH in the pod to `withdrawableRestakedExecutionLayerGwei` // ... this amount can be withdrawn via the `DelegationManager` withdrawal queue - withdrawableRestakedExecutionLayerGwei += uint64(checkpoint.podBalanceGwei); + withdrawableRestakedExecutionLayerGwei += checkpoint.podBalanceGwei; // Finalize the checkpoint lastCheckpointTimestamp = currentCheckpointTimestamp; @@ -654,9 +654,9 @@ contract EigenPod is } /// @dev Calculates the delta between two Gwei amounts and returns as an int256 - function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int256) { + function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int128) { return - int256(uint256(newAmountGwei)) - int256(uint256(previousAmountGwei)); + int128(uint128(newAmountGwei)) - int128(uint128(previousAmountGwei)); } /******************************************************************************* From 42b3399a28fbcb52b01ef2202521cdcc1e3efc19 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:06:53 -0400 Subject: [PATCH 16/85] feat: remove activateRestaking in favor of startCheckpoint (#577) * see PR comment for details --- script/deploy/mainnet/M2Deploy.s.sol | 16 +----- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 2 +- src/contracts/interfaces/IEigenPod.sol | 14 ----- src/contracts/pods/EigenPod.sol | 56 +++++-------------- src/contracts/pods/EigenPodStorage.sol | 2 +- src/test/EigenPod.t.sol | 8 +-- src/test/harnesses/EigenPodHarness.sol | 6 +- src/test/integration/IntegrationBase.t.sol | 2 +- src/test/integration/users/User.t.sol | 13 ----- src/test/unit/EigenPod-PodManagerUnit.t.sol | 17 +++--- src/test/unit/EigenPodUnit.t.sol | 20 +++---- 11 files changed, 40 insertions(+), 116 deletions(-) diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index c45e3e045..4558f2bda 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -315,10 +315,6 @@ contract M2Deploy is Script, Test { ); require(eigenPodManager.hasPod(eigenPodDepositor) == hasPod, "eigenPodManager.hasPod incorrect"); require(eigenPod.podOwner() == eigenPodOwner, "eigenPod.podOwner incorrect"); - require( - eigenPod.mostRecentWithdrawalTimestamp() == mostRecentWithdrawalBlock, - "eigenPod.mostRecentWithdrawalTimestamp incorrect" - ); // Timestmap replace by block number in storage require(!eigenPod.hasRestaked(), "eigenPod.hasRestaked incorrect"); // Unpause eigenpods verify credentials @@ -334,19 +330,11 @@ contract M2Deploy is Script, Test { cheats.prank(eigenPodOwner); cheats.expectEmit(true, true, true, true); emit RestakingActivated(eigenPodOwner); - eigenPod.activateRestaking(); + eigenPod.startCheckpoint(false); // Check updated storage values require(eigenPod.hasRestaked(), "eigenPod.hasRestaked not set to true"); require(address(eigenPod).balance == 0, "eigenPod balance not 0 after activating restaking"); - require( - eigenPod.mostRecentWithdrawalTimestamp() == block.timestamp, - "eigenPod.mostRecentWithdrawalTimestamp not updated" - ); - require( - eigenPod.mostRecentWithdrawalTimestamp() > mostRecentWithdrawalBlock, - "eigenPod.mostRecentWithdrawalTimestamp not updated" - ); // Check that delayed withdrawal has been created require( @@ -368,13 +356,11 @@ contract M2Deploy is Script, Test { // Existing EigenPod owner – EigenPodManager.ownerToPod remains the same // Existing EigenPod owner – EigenPodManager.hasPod remains the same // Existing EigenPod owner – EigenPod.podOwner remains the same - // Existing EigenPod owner – EigenPod.mostRecentWithdrawalTimestamp (after upgrade) == EigenPod.mostRecentWithdrawalBlock (before upgrade) // Existing EigenPod owner – EigenPod.hasRestaked remains false // Can call EigenPod.activateRestaking and it correctly: // Sends all funds in EigenPod (need to make sure it has nonzero balance beforehand) // Sets `hasRestaked` to ‘true’ // Emits a ‘RestakingActivated’ event - // EigenPod.mostRecentWithdrawalTimestamp updates correctly // EigenPod: ethPOS, delayedWithdrawalRouter, eigenPodManager event RestakingActivated(address indexed podOwner); } diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index 0664f89f0..75ba1fd95 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -322,7 +322,7 @@ contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { bytes[] memory validatorFieldsProofs; bytes32[][] memory validatorFields; cheats.startPrank(existingEigenPod.podOwner()); - existingEigenPod.activateRestaking(); + existingEigenPod.startCheckpoint(false); cheats.expectRevert("EigenPodManager.getBlockRootAtTimestamp: state root at timestamp not yet finalized"); existingEigenPod.verifyWithdrawalCredentials( uint64(block.timestamp), diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index c1b45097d..64b7364b5 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -104,13 +104,6 @@ interface IEigenPod { /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. function hasRestaked() external view returns (bool); - /** - * @notice The latest timestamp at which the pod owner withdrew the balance of the pod, via calling `withdrawBeforeRestaking`. - * @dev This variable is only updated when the `withdrawBeforeRestaking` function is called, which can only occur before `hasRestaked` is set to true for this pod. - * Proofs for this pod are only valid against Beacon Chain state roots corresponding to timestamps after the stored `mostRecentWithdrawalTimestamp`. - */ - function mostRecentWithdrawalTimestamp() external view returns (uint64); - /// @notice Returns the validatorInfo struct for the provided pubkeyHash function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory); @@ -212,13 +205,6 @@ interface IEigenPod { ) external; - /** - * @notice Called by the pod owner to activate restaking by withdrawing - * all existing ETH from the pod and preventing further withdrawals via - * "withdrawBeforeRestaking()" - */ - function activateRestaking() external; - /// @notice called by owner of a pod to remove any ERC20s deposited in the pod function recoverTokens(IERC20[] memory tokenList, uint256[] memory amountsToWithdraw, address recipient) external; } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index f9d8a7ec0..a278a75c4 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -81,21 +81,6 @@ contract EigenPod is _; } - modifier hasNeverRestaked() { - require(!hasRestaked, "EigenPod.hasNeverRestaked: restaking is enabled"); - _; - } - - /// @notice Checks that `timestamp` is greater than or equal to `mostRecentWithdrawalTimestamp` - modifier afterRestaking(uint64 timestamp) { - require( - hasRestaked && - timestamp >= mostRecentWithdrawalTimestamp, - "EigenPod.afterRestaking: timestamp must be at or after restaking was activated" - ); - _; - } - /** * @notice Based on 'Pausable' code, but uses the storage of the EigenPodManager instead of this contract. This construction * is necessary for enabling pausing all EigenPods at the same time (due to EigenPods being Beacon Proxies). @@ -128,12 +113,9 @@ contract EigenPod is function initialize(address _podOwner) external initializer { require(_podOwner != address(0), "EigenPod.initialize: podOwner cannot be zero address"); podOwner = _podOwner; - /** - * From the M2 deployment onwards, we are requiring that pods deployed are by default enabled with restaking - * In prior deployments without proofs, EigenPods could be deployed with restaking disabled so as to allow - * simple (proof-free) withdrawals. However, this is no longer the case. Thus going forward, all pods are - * initialized with hasRestaked set to true. - */ + + /// Pods deployed prior to the M2 release have this variable set to `false`, as before M2, pod owners + /// did not need to engage with the proof system and were able to withdraw ETH from their pod on demand. hasRestaked = true; emit RestakingActivated(podOwner); } @@ -163,9 +145,16 @@ contract EigenPod is external onlyEigenPodOwner() onlyWhenNotPaused(PAUSED_START_CHECKPOINT) - afterRestaking(uint64(block.timestamp)) /// TODO - this is the wrong condition { _startCheckpoint(revertIfNoBalance); + + /// Legacy support for pods deployed pre-M2 that never activated restaking. `startCheckpoint` + /// can activate restaking, allowing them to continue using their pods via the checkpoint + /// system. + if (!hasRestaked) { + hasRestaked = true; + emit RestakingActivated(podOwner); + } } /** @@ -264,8 +253,9 @@ contract EigenPod is external onlyEigenPodOwner onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - afterRestaking(beaconTimestamp) { + require(hasRestaked, "EigenPod.verifyWithdrawalCredentials: restaking not active"); + require( (validatorIndices.length == validatorFieldsProofs.length) && (validatorFieldsProofs.length == validatorFields.length), @@ -377,26 +367,6 @@ contract EigenPod is } } - /** - * @notice Called by the pod owner to activate restaking by withdrawing - * all existing ETH from the pod by starting a checkpoint. Once this is called, - * the pod owner can begin proving validator withdrawal credentials and checkpoints - * to receive shares for beacon chain ETH. - * Note: This method is only callable on pods that were deployed *before* the M2 - * upgrade. After the M2 upgrade, restaking is enabled by default. - */ - function activateRestaking() - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - onlyEigenPodOwner - hasNeverRestaked - { - hasRestaked = true; - - emit RestakingActivated(podOwner); - _startCheckpoint(false); - } - /// @notice Called by EigenPodManager when the owner wants to create another ETH validator. function stake( bytes calldata pubkey, diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 71069af28..71870a00a 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -13,7 +13,7 @@ abstract contract EigenPodStorage is IEigenPod { * @dev This variable is only updated when the `withdrawBeforeRestaking` function is called, which can only occur before `hasRestaked` is set to true for this pod. * Proofs for this pod are only valid against Beacon Chain state roots corresponding to timestamps after the stored `mostRecentWithdrawalTimestamp`. */ - uint64 public mostRecentWithdrawalTimestamp; + uint64 internal __deprecated_mostRecentWithdrawalTimestamp; /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), uint64 public withdrawableRestakedExecutionLayerGwei; diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index 35826bf62..f5a528580 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -377,7 +377,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // activate restaking cheats.startPrank(podOwner); - newPod.activateRestaking(); + newPod.startCheckpoint(false); // Ensure verifyWC fails for each slot remaining in the epoch for (uint i = 0; i < 32; i++) { @@ -945,7 +945,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.startPrank(podOwner); if (!newPod.hasRestaked()) { - newPod.activateRestaking(); + newPod.startCheckpoint(false); } // set oracle block root _setOracleBlockRoot(); @@ -1680,7 +1680,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.startPrank(_podOwner); cheats.warp(timestamp); if (newPod.hasRestaked() == false) { - newPod.activateRestaking(); + newPod.startCheckpoint(false); } //set the oracle block root _setOracleBlockRoot(); @@ -1728,7 +1728,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { function _verifyWCStartTimestamp(IEigenPod pod) internal returns (uint64) { uint64 genesis = EigenPod(payable(address(pod))).GENESIS_TIME(); - uint64 activateRestakingTimestamp = pod.mostRecentWithdrawalTimestamp(); + uint64 activateRestakingTimestamp; // For pods deployed after M2, `mostRecentWithdrawalTimestamp` will always be 0 // In order to give our `_nextEpochStartTimestamp` a sane calculation, we set it diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 229dbbc0e..91635312b 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -47,8 +47,4 @@ contract EPInternalFunctions is EigenPod, Test { function setValidatorRestakedBalance(bytes32 pkhash, uint64 restakedBalanceGwei) public { _validatorPubkeyHashToInfo[pkhash].restakedBalanceGwei = restakedBalanceGwei; } - - function setMostRecentWithdrawalTimestamp(uint64 _mostRecentWithdrawalTimestamp) public { - mostRecentWithdrawalTimestamp = _mostRecentWithdrawalTimestamp; - } - } +} diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index fdbd176d4..cc66886de 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -116,7 +116,7 @@ abstract contract IntegrationBase is IntegrationDeployer { // Enable restaking for stakers' pods for (uint i = 0; i < stakersToMigrate.length; i++) { - stakersToMigrate[i].activateRestaking(); + stakersToMigrate[i].startCheckpoint(); } // Register operators with DelegationManager diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 163b86f4f..2c3fceaa8 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -315,19 +315,6 @@ contract User is PrintUtils { }); } - /// @notice We set the proof generation start time to be after the timestamp that pod restaking is activated - /// We do this to prevent proofIsForValidTimestamp modifier from reverting - /// TODO remove - function activateRestaking() public createSnapshot { - _logM("activateRestaking"); - - // _log("pre-activation, most recent wd timestamp", uint(pod.mostRecentWithdrawalTimestamp())); - - pod.activateRestaking(); - - // _log("post-activation, most recent wd timestamp", pod.mostRecentWithdrawalTimestamp()); - } - /******************************************************************************* STRATEGYMANAGER METHODS *******************************************************************************/ diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol index c8f346bda..429e24620 100644 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ b/src/test/unit/EigenPod-PodManagerUnit.t.sol @@ -125,7 +125,6 @@ contract EigenPod_PodManager_UnitTests_EigenPodPausing is EigenPod_PodManager_Un * 1. verifyBalanceUpdates revert when PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE set * 2. verifyAndProcessWithdrawals revert when PAUSED_EIGENPODS_VERIFY_WITHDRAWAL set * 3. verifyWithdrawalCredentials revert when PAUSED_EIGENPODS_VERIFY_CREDENTIALS set - * 4. activateRestaking revert when PAUSED_EIGENPODS_VERIFY_CREDENTIALS set */ /// @notice Index for flag that pauses creation of new EigenPods when set. See EigenPodManager code for details. @@ -202,15 +201,15 @@ contract EigenPod_PodManager_UnitTests_EigenPodPausing is EigenPod_PodManager_Un ); } - function test_activateRestaking_revert_pausedEigenVerifyCredentials() public { - // pause the contract - cheats.prank(address(pauser)); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); + // function test_activateRestaking_revert_pausedEigenVerifyCredentials() public { + // // pause the contract + // cheats.prank(address(pauser)); + // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); - cheats.prank(address(podOwner)); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - eigenPod.activateRestaking(); - } + // cheats.prank(address(podOwner)); + // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); + // eigenPod.activateRestaking(); + // } } contract EigenPod_PodManager_UnitTests_EigenPod is EigenPod_PodManager_UnitTests { diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index c2b83b3d7..018e8ab7e 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -255,18 +255,18 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven Activate Restaking Tests *******************************************************************************/ - function testFuzz_activateRestaking_revert_notPodOwner(address invalidCaller) public { - cheats.assume(invalidCaller != podOwner); + // function testFuzz_activateRestaking_revert_notPodOwner(address invalidCaller) public { + // cheats.assume(invalidCaller != podOwner); - cheats.prank(invalidCaller); - cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - eigenPod.activateRestaking(); - } + // cheats.prank(invalidCaller); + // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); + // eigenPod.activateRestaking(); + // } - function test_activateRestaking_revert_alreadyRestaked() public { - cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); - eigenPod.activateRestaking(); - } + // function test_activateRestaking_revert_alreadyRestaked() public { + // cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); + // eigenPod.activateRestaking(); + // } // function testFuzz_activateRestaking(uint256 ethAmount) public hasNotRestaked { // // Seed some ETH From 20297ce627735e316520497437a665b89566863e Mon Sep 17 00:00:00 2001 From: gpsanant Date: Mon, 3 Jun 2024 12:48:43 -0700 Subject: [PATCH 17/85] test: add proofgen test contract * fix: rename and add balance proof --- src/test/utils/BeaconChainProofsWrapper.sol | 41 +++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/utils/BeaconChainProofsWrapper.sol diff --git a/src/test/utils/BeaconChainProofsWrapper.sol b/src/test/utils/BeaconChainProofsWrapper.sol new file mode 100644 index 000000000..d093848d4 --- /dev/null +++ b/src/test/utils/BeaconChainProofsWrapper.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "src/contracts/libraries/BeaconChainProofs.sol"; + +/// @notice This contract is used to test offchain proof generation +contract BeaconChainProofsWrapper { + + function verifyStateRoot( + bytes32 beaconBlockRoot, + BeaconChainProofs.StateRootProof calldata proof + ) external view { + BeaconChainProofs.verifyStateRoot(beaconBlockRoot, proof); + } + + function verifyValidatorFields( + bytes32 beaconStateRoot, + bytes32[] calldata validatorFields, + bytes calldata validatorFieldsProof, + uint40 validatorIndex + ) external view { + BeaconChainProofs.verifyValidatorFields(beaconStateRoot, validatorFields, validatorFieldsProof, validatorIndex); + } + + function verifyBalanceContainer( + bytes32 beaconBlockRoot, + BeaconChainProofs.BalanceContainerProof calldata proof + ) external view { + BeaconChainProofs.verifyBalanceContainer(beaconBlockRoot, proof); + } + + function verifyValidatorBalance( + bytes32 balanceContainerRoot, + uint40 validatorIndex, + BeaconChainProofs.BalanceProof calldata proof + ) external view { + BeaconChainProofs.verifyValidatorBalance(balanceContainerRoot, validatorIndex, proof); + } + + +} \ No newline at end of file From e97fcf31f116043449283615e9e31986aead6320 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 4 Jun 2024 15:16:36 +0000 Subject: [PATCH 18/85] feat: track balance exited for checkpoints --- src/contracts/interfaces/IEigenPod.sol | 116 +++++++++++++------ src/contracts/pods/EigenPod.sol | 34 +++--- src/contracts/pods/EigenPodStorage.sol | 26 ++++- src/test/integration/IntegrationBase.t.sol | 30 +++++ src/test/integration/IntegrationChecks.t.sol | 1 + src/test/mocks/EigenPodMock.sol | 2 + 6 files changed, 156 insertions(+), 53 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 64b7364b5..675c53a98 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -22,6 +22,10 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; */ interface IEigenPod { + /******************************************************************************* + STRUCTS / ENUMS + *******************************************************************************/ + enum VALIDATOR_STATUS { INACTIVE, // doesnt exist ACTIVE, // staked on ethpos and withdrawal credentials are pointed to the EigenPod @@ -46,6 +50,10 @@ interface IEigenPod { int128 balanceDeltasGwei; } + /******************************************************************************* + EVENTS + *******************************************************************************/ + /// @notice Emitted when an ETH validator stakes via this eigenPod event EigenPodStaked(bytes pubkey); @@ -77,8 +85,9 @@ interface IEigenPod { /// @notice Emitted when a validaor is proven to have 0 balance at a given checkpoint event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); - /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), - function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); + /******************************************************************************* + EXTERNAL STATE-CHANGING METHODS + *******************************************************************************/ /// @notice Used to initialize the pointers to contracts crucial to the pod's functionality, in beacon proxy construction from EigenPodManager function initialize(address owner) external; @@ -95,39 +104,6 @@ interface IEigenPod { */ function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) external; - /// @notice The single EigenPodManager for EigenLayer - function eigenPodManager() external view returns (IEigenPodManager); - - /// @notice The owner of this EigenPod - function podOwner() external view returns (address); - - /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. - function hasRestaked() external view returns (bool); - - /// @notice Returns the validatorInfo struct for the provided pubkeyHash - function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory); - - /// @notice Returns the validatorInfo struct for the provided pubkey - function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory); - - /// @notice This returns the status of a given validator - function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS); - - /// @notice This returns the status of a given validator pubkey - function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS); - - /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals - function activeValidatorCount() external view returns (uint256); - - /// @notice The timestamp of the last checkpoint finalized - function lastCheckpointTimestamp() external view returns (uint64); - - /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint - function currentCheckpointTimestamp() external view returns (uint64); - - /// @notice Returns the currently-active checkpoint - function currentCheckpoint() external view returns (Checkpoint memory); - /** * @dev Create a checkpoint used to prove this pod's active validator set. Checkpoints are completed * by submitting one checkpoint proof per ACTIVE validator. During the checkpoint process, the total @@ -157,7 +133,7 @@ interface IEigenPod { BeaconChainProofs.BalanceProof[] calldata proofs ) external; - + /** * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and @@ -180,7 +156,7 @@ interface IEigenPod { bytes32[][] calldata validatorFields ) external; - + /** * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely * checkpoint proofs since being slashed. If successful, this allows the caller to start a checkpoint. @@ -204,7 +180,71 @@ interface IEigenPod { BeaconChainProofs.ValidatorProof calldata proof ) external; - + /// @notice called by owner of a pod to remove any ERC20s deposited in the pod function recoverTokens(IERC20[] memory tokenList, uint256[] memory amountsToWithdraw, address recipient) external; + + /******************************************************************************* + VIEW METHODS + *******************************************************************************/ + + /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from beaconchain but not EigenLayer), + function withdrawableRestakedExecutionLayerGwei() external view returns (uint64); + + /// @notice The single EigenPodManager for EigenLayer + function eigenPodManager() external view returns (IEigenPodManager); + + /// @notice The owner of this EigenPod + function podOwner() external view returns (address); + + /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. + function hasRestaked() external view returns (bool); + + /// @notice Returns the validatorInfo struct for the provided pubkeyHash + function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory); + + /// @notice Returns the validatorInfo struct for the provided pubkey + function validatorPubkeyToInfo(bytes calldata validatorPubkey) external view returns (ValidatorInfo memory); + + /// @notice This returns the status of a given validator + function validatorStatus(bytes32 pubkeyHash) external view returns (VALIDATOR_STATUS); + + /// @notice This returns the status of a given validator pubkey + function validatorStatus(bytes calldata validatorPubkey) external view returns (VALIDATOR_STATUS); + + /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals + function activeValidatorCount() external view returns (uint256); + + /// @notice The timestamp of the last checkpoint finalized + function lastCheckpointTimestamp() external view returns (uint64); + + /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint + function currentCheckpointTimestamp() external view returns (uint64); + + /// @notice Returns the currently-active checkpoint + function currentCheckpoint() external view returns (Checkpoint memory); + + /// @notice For each checkpoint, the total balance attributed to exited validators, in gwei + /// + /// Note that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's + /// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their + /// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator + /// has been fully exited, it is possible that the magnitude of this change does not capture what is + /// typically thought of as a "full exit." + /// + /// For example: + /// 1. Consider a validator was last checkpointed at 32 ETH before exiting. Once the exit has been processed, + /// it is expected that the validator's exited balance is calculated to be `32 ETH`. + /// 2. However, before `startCheckpoint` is called, a deposit is made to the validator for 1 ETH. The beacon + /// chain will automatically withdraw this ETH, but not until the withdrawal sweep passes over the validator + /// again. Until this occurs, the validator's current balance (used for checkpointing) is 1 ETH. + /// 3. If `startCheckpoint` is called at this point, the balance delta calculated for this validator will be + /// `-31 ETH`, and because the validator has a nonzero balance, it is not marked WITHDRAWN. + /// 4. After the exit is processed by the beacon chain, a subsequent `startCheckpoint` and checkpoint proof + /// will calculate a balance delta of `-1 ETH` and attribute a 1 ETH exit to the validator. + /// + /// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits + /// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically + /// exited. + function checkpointBalanceExitedGwei(uint64) external view returns (uint64); } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index a278a75c4..4616c4979 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -189,6 +189,7 @@ contract EigenPod is }); // Process each checkpoint proof submitted + uint64 exitedBalancesGwei; for (uint256 i = 0; i < proofs.length; i++) { ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proofs[i].pubkeyHash]; @@ -214,7 +215,7 @@ contract EigenPod is // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. // The assumption is that if this is the case, any withdrawn ETH was already in // the pod when `startCheckpoint` was originally called. - int128 balanceDeltaGwei = _verifyCheckpointProof({ + (int128 balanceDeltaGwei, uint64 exitedBalanceGwei) = _verifyCheckpointProof({ validatorInfo: validatorInfo, beaconTimestamp: beaconTimestamp, balanceContainerRoot: balanceContainerProof.balanceContainerRoot, @@ -223,9 +224,11 @@ contract EigenPod is checkpoint.proofsRemaining--; checkpoint.balanceDeltasGwei += balanceDeltaGwei; + exitedBalancesGwei += exitedBalanceGwei; } - // Update and/or finalize the checkpoint + // Update the checkpoint and the total amount attributed to exited validators + checkpointBalanceExitedGwei[beaconTimestamp] += exitedBalancesGwei; _updateCheckpoint(checkpoint); } @@ -468,7 +471,7 @@ contract EigenPod is uint64 beaconTimestamp, bytes32 balanceContainerRoot, BeaconChainProofs.BalanceProof calldata proof - ) internal returns (int128 balanceDeltaGwei) { + ) internal returns (int128 balanceDeltaGwei, uint64 exitedBalanceGwei) { uint40 validatorIndex = uint40(validatorInfo.validatorIndex); // Verify validator balance against `balanceContainerRoot` @@ -479,12 +482,25 @@ contract EigenPod is proof: proof }); + // Calculate change in the validator's balance since the last proof + if (newBalanceGwei != prevBalanceGwei) { + balanceDeltaGwei = _calcBalanceDelta({ + newAmountGwei: newBalanceGwei, + previousAmountGwei: prevBalanceGwei + }); + + emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, newBalanceGwei); + } + // Update validator state. If their new balance is 0, they are marked `WITHDRAWN` validatorInfo.restakedBalanceGwei = newBalanceGwei; validatorInfo.mostRecentBalanceUpdateTimestamp = beaconTimestamp; if (newBalanceGwei == 0) { activeValidatorCount--; validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; + // If we reach this point, `balanceDeltaGwei` should always be negative, + // so this should be a safe conversion + exitedBalanceGwei = uint64(uint128(-balanceDeltaGwei)); emit ValidatorWithdrawn(beaconTimestamp, validatorIndex); } @@ -492,17 +508,7 @@ contract EigenPod is _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; emit ValidatorCheckpointed(beaconTimestamp, validatorIndex); - // Calculate change in the validator's balance since the last proof - if (newBalanceGwei != prevBalanceGwei) { - emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, newBalanceGwei); - - balanceDeltaGwei = _calcBalanceDelta({ - newAmountGwei: newBalanceGwei, - previousAmountGwei: prevBalanceGwei - }); - } - - return balanceDeltaGwei; + return (balanceDeltaGwei, exitedBalanceGwei); } /** diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 71870a00a..6c5c09586 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -42,6 +42,30 @@ abstract contract EigenPodStorage is IEigenPod { /// @notice The timestamp of the currently-active checkpoint. Will be 0 if there is not active checkpoint uint64 public currentCheckpointTimestamp; + /// @notice For each checkpoint, the total balance attributed to exited validators, in gwei + /// + /// Note that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's + /// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their + /// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator + /// has been fully exited, it is possible that the magnitude of this change does not capture what is + /// typically thought of as a "full exit." + /// + /// For example: + /// 1. Consider a validator was last checkpointed at 32 ETH before exiting. Once the exit has been processed, + /// it is expected that the validator's exited balance is calculated to be `32 ETH`. + /// 2. However, before `startCheckpoint` is called, a deposit is made to the validator for 1 ETH. The beacon + /// chain will automatically withdraw this ETH, but not until the withdrawal sweep passes over the validator + /// again. Until this occurs, the validator's current balance (used for checkpointing) is 1 ETH. + /// 3. If `startCheckpoint` is called at this point, the balance delta calculated for this validator will be + /// `-31 ETH`, and because the validator has a nonzero balance, it is not marked WITHDRAWN. + /// 4. After the exit is processed by the beacon chain, a subsequent `startCheckpoint` and checkpoint proof + /// will calculate a balance delta of `-1 ETH` and attribute a 1 ETH exit to the validator. + /// + /// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits + /// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically + /// exited. + mapping(uint64 => uint64) public checkpointBalanceExitedGwei; + /// @notice The current checkpoint, if there is one active Checkpoint internal _currentCheckpoint; @@ -50,5 +74,5 @@ abstract contract EigenPodStorage is IEigenPod { * 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[37] private __gap; } \ No newline at end of file diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index cc66886de..a6c3dbbb3 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -704,6 +704,27 @@ abstract contract IntegrationBase is IntegrationDeployer { assertEq(prevWithdrawableRestakedGwei + addedGwei, curWithdrawableRestakedGwei, err); } + function assert_Snap_Added_BalanceExitedGwei( + User staker, + uint64 addedGwei, + string memory err + ) internal { + uint64 curCheckpointTimestamp = _getCheckpointTimestamp(staker); + uint64 prevCheckpointTimestamp = _getPrevCheckpointTimestamp(staker); + + // If we just finalized a checkpoint, that's the timestamp we want to use + // to look up checkpoint balances exited + uint64 targetTimestamp = curCheckpointTimestamp; + if (curCheckpointTimestamp != prevCheckpointTimestamp) { + targetTimestamp = prevCheckpointTimestamp; + } + + uint64 curExitedBalanceGwei = _getCheckpointBalanceExited(staker, targetTimestamp); + uint64 prevExitedBalanceGwei = _getPrevCheckpointBalanceExited(staker, targetTimestamp); + + assertEq(prevExitedBalanceGwei + addedGwei, curExitedBalanceGwei, err); + } + /******************************************************************************* UTILITY METHODS *******************************************************************************/ @@ -1111,4 +1132,13 @@ abstract contract IntegrationBase is IntegrationDeployer { function _getPrevCheckpointPodBalanceGwei(User staker) internal timewarp() returns (uint64) { return _getCheckpointPodBalanceGwei(staker); } + + function _getCheckpointBalanceExited(User staker, uint64 checkpointTimestamp) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return pod.checkpointBalanceExitedGwei(checkpointTimestamp); + } + + function _getPrevCheckpointBalanceExited(User staker, uint64 checkpointTimestamp) internal timewarp() returns (uint64) { + return _getCheckpointBalanceExited(staker, checkpointTimestamp); + } } \ No newline at end of file diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index b8f8a133e..b0f6eb658 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -50,6 +50,7 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_State(staker); assert_Snap_Added_WithdrawableGwei(staker, exitedBalanceGwei, "should have added expected gwei to withdrawable restaked exec layer gwei"); + 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"); } diff --git a/src/test/mocks/EigenPodMock.sol b/src/test/mocks/EigenPodMock.sol index e0250298f..db0dc4843 100644 --- a/src/test/mocks/EigenPodMock.sol +++ b/src/test/mocks/EigenPodMock.sol @@ -55,6 +55,8 @@ contract EigenPodMock is IEigenPod, Test { /// @notice Returns the currently-active checkpoint function currentCheckpoint() external view returns (Checkpoint memory) {} + function checkpointBalanceExitedGwei(uint64) external view returns (uint64) {} + function startCheckpoint(bool revertIfNoBalance) external {} function verifyCheckpointProofs( From 6bf1b1a0e90deb059aaf573cc5fca19aeb17f997 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 4 Jun 2024 15:31:29 +0000 Subject: [PATCH 19/85] chore: deprecate deneb fork timestamp functions in EigenPodManager --- .../holesky/M2_Deploy_From_Scratch.s.sol | 3 -- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 11 ++--- script/utils/ExistingDeploymentParser.sol | 4 -- src/contracts/interfaces/IEigenPodManager.sol | 19 -------- src/contracts/pods/EigenPodManager.sol | 25 ---------- src/contracts/pods/EigenPodManagerStorage.sol | 2 +- .../integration/IntegrationDeployer.t.sol | 11 ----- src/test/unit/EigenPod-PodManagerUnit.t.sol | 2 - src/test/unit/EigenPodManagerUnit.t.sol | 46 ------------------- 9 files changed, 6 insertions(+), 117 deletions(-) diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index 97af355b7..dc7349a3b 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -203,9 +203,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { strategyManager.addStrategiesToDepositWhitelist(strategiesToWhitelist, thirdPartyTransfersForbiddenValues); strategyManager.setStrategyWhitelister(STRATEGY_MANAGER_WHITELISTER); - // Fork timestamp config - eigenPodManager.setDenebForkTimestamp(EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP); - // Transfer ownership strategyManager.transferOwnership(executorMultisig); eigenLayerProxyAdmin.transferOwnership(executorMultisig); diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index 75ba1fd95..b0737be5b 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -121,7 +121,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { delegationManager.unpause(0); eigenPodManager.unpause(0); - eigenPodManager.setDenebForkTimestamp(EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); vm.stopPrank(); @@ -215,11 +214,11 @@ contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { // ); // set Deneb fork timestamp on EigenPodManager - txs[8] = Tx( - address(eigenPodManager), - 0, // value - abi.encodeWithSelector(EigenPodManager.setDenebForkTimestamp.selector, EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP) - ); + // txs[8] = Tx( + // address(eigenPodManager), + // 0, // value + // abi.encodeWithSelector(EigenPodManager.setDenebForkTimestamp.selector, EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP) + // ); // unpause everything on DelegationManager txs[9] = Tx( diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index e8dc27625..80fa773e6 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -641,10 +641,6 @@ contract ExistingDeploymentParser is Script, Test { eigenPodManager.paused() == EIGENPOD_MANAGER_INIT_PAUSED_STATUS, "eigenPodManager: init paused status set incorrectly" ); - require( - eigenPodManager.denebForkTimestamp() == EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP, - "eigenPodManager: denebForkTimestamp not set correctly" - ); require( eigenPodManager.ethPOS() == IETHPOSDeposit(ETHPOSDepositAddress), "eigenPodManager: ethPOS not set correctly" diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index 1620ad8b6..2cc6d2372 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -17,9 +17,6 @@ import "./IStrategy.sol"; */ interface IEigenPodManager is IPausable { - /// @notice Emitted to notify the update of the beaconChainOracle address - event BeaconOracleUpdated(address indexed newOracleAddress); - /// @notice Emitted to notify the deployment of an EigenPod event PodDeployed(address indexed eigenPod, address indexed podOwner); @@ -39,8 +36,6 @@ interface IEigenPodManager is IPausable { bytes32 withdrawalRoot ); - event DenebForkTimestampUpdated(uint64 newValue); - /** * @notice Creates an EigenPod for the sender. * @dev Function will revert if the `msg.sender` already has an EigenPod. @@ -129,18 +124,4 @@ interface IEigenPodManager is IPausable { * @dev Reverts if `shares` is not a whole Gwei amount */ function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) external; - - /** - * @notice the deneb hard fork timestamp used to determine which proof path to use for proving a withdrawal - */ - function denebForkTimestamp() external view returns (uint64); - - /** - * setting the deneb hard fork timestamp by the eigenPodManager owner - * @dev this function is designed to be called twice. Once, it is set to type(uint64).max - * prior to the actual deneb fork timestamp being set, and then the second time it is set - * to the actual deneb fork timestamp. - */ - function setDenebForkTimestamp(uint64 newDenebForkTimestamp) external; - } diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 108ed9028..147a77a7e 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -219,18 +219,6 @@ contract EigenPodManager is ownerToPod[podOwner].withdrawRestakedBeaconChainETH(destination, shares); } - /** - * @notice Sets the timestamp of the Deneb fork. - * @param newDenebForkTimestamp is the new timestamp of the Deneb fork - */ - function setDenebForkTimestamp(uint64 newDenebForkTimestamp) external onlyOwner { - require(newDenebForkTimestamp != 0, "EigenPodManager.setDenebForkTimestamp: cannot set newDenebForkTimestamp to 0"); - require(_denebForkTimestamp == 0, "EigenPodManager.setDenebForkTimestamp: cannot set denebForkTimestamp more than once"); - - _denebForkTimestamp = newDenebForkTimestamp; - emit DenebForkTimestampUpdated(newDenebForkTimestamp); - } - // INTERNAL FUNCTIONS function _deployPod() internal returns (IEigenPod) { @@ -296,17 +284,4 @@ contract EigenPodManager is function hasPod(address podOwner) public view returns (bool) { return address(ownerToPod[podOwner]) != address(0); } - - /** - * @notice Wrapper around the `_denebForkTimestamp` storage variable that returns type(uint64).max if the storage variable is unset. - * @dev This allows restricting the storage variable to be set once and only once. - */ - function denebForkTimestamp() public view returns (uint64) { - uint64 timestamp = _denebForkTimestamp; - if (timestamp == 0) { - return type(uint64).max; - } else { - return timestamp; - } - } } diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index 238a89da1..2719a3d2a 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -74,7 +74,7 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { */ mapping(address => int256) public podOwnerShares; - uint64 internal _denebForkTimestamp; + uint64 internal __deprecated_denebForkTimestamp; constructor( IETHPOSDeposit _ethPOS, diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index f94e8f869..7c429aa7d 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -362,9 +362,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { cheats.warp(GENESIS_TIME_LOCAL); timeMachine = new TimeMachine(); beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_LOCAL); - - //set deneb fork timestamp - eigenPodManager.setDenebForkTimestamp(type(uint64).max); } /** @@ -460,10 +457,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - if (eigenPodManager.denebForkTimestamp() == type(uint64).max) { - //set deneb fork timestamp if not set - eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP); - } cheats.stopPrank(); ethStrats.push(BEACONCHAIN_ETH_STRAT); @@ -564,10 +557,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager.unpause(0); strategyManager.unpause(0); - if (eigenPodManager.denebForkTimestamp() == type(uint64).max) { - //set deneb fork timestamp if not set - eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP); - } cheats.stopPrank(); ethStrats.push(BEACONCHAIN_ETH_STRAT); diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol index 429e24620..43833bab6 100644 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ b/src/test/unit/EigenPod-PodManagerUnit.t.sol @@ -115,8 +115,6 @@ contract EigenPod_PodManager_UnitTests is EigenLayerUnitTestSetup { // Set storage in EPM EigenPodManagerWrapper(address(eigenPodManager)).setPodAddress(podOwner, eigenPod); - - eigenPodManager.setDenebForkTimestamp(type(uint64).max); } } diff --git a/src/test/unit/EigenPodManagerUnit.t.sol b/src/test/unit/EigenPodManagerUnit.t.sol index 581bcb18c..7165320ce 100644 --- a/src/test/unit/EigenPodManagerUnit.t.sol +++ b/src/test/unit/EigenPodManagerUnit.t.sol @@ -128,52 +128,6 @@ contract EigenPodManagerUnitTests_Initialization_Setters is EigenPodManagerUnitT pauserRegistry, 0 /*initialPausedStatus*/); } - - /******************************************************************************* - Setters - *******************************************************************************/ - - // function testFuzz_updateBeaconChainOracle_revert_notOwner(address notOwner) public filterFuzzedAddressInputs(notOwner) { - // cheats.assume(notOwner != initialOwner); - // cheats.prank(notOwner); - // cheats.expectRevert("Ownable: caller is not the owner"); - // eigenPodManager.updateBeaconChainOracle(IBeaconChainOracle(address(1))); - // } - - // function test_updateBeaconChainOracle() public { - // // Set new beacon chain oracle - // IBeaconChainOracle newBeaconChainOracle = IBeaconChainOracle(address(1)); - // cheats.prank(initialOwner); - // cheats.expectEmit(true, true, true, true); - // emit BeaconOracleUpdated(address(newBeaconChainOracle)); - // eigenPodManager.updateBeaconChainOracle(newBeaconChainOracle); - - // // Check storage update - // assertEq(address(eigenPodManager.beaconChainOracle()), address(newBeaconChainOracle), "Beacon chain oracle not updated"); - // } - - function test_setDenebForkTimestamp(uint64 denebForkTimestamp) public { - cheats.assume(denebForkTimestamp != 0); - cheats.assume(denebForkTimestamp != type(uint64).max); - cheats.prank(initialOwner); - - cheats.expectEmit(true, true, true, true); - emit DenebForkTimestampUpdated(denebForkTimestamp); - eigenPodManager.setDenebForkTimestamp(denebForkTimestamp); - assertEq(eigenPodManager.denebForkTimestamp(), denebForkTimestamp, "fork timestamp not set correctly"); - } - - function test_setDenebForkTimestamp_Twice(uint64 timestamp1, uint64 timestamp2) public { - cheats.assume(timestamp1 != 0); - cheats.assume(timestamp2 != 0); - cheats.assume(timestamp1 != type(uint64).max); - cheats.assume(timestamp2 != type(uint64).max); - cheats.prank(initialOwner); - - eigenPodManager.setDenebForkTimestamp(timestamp1); - cheats.expectRevert(bytes("EigenPodManager.setDenebForkTimestamp: cannot set denebForkTimestamp more than once")); - eigenPodManager.setDenebForkTimestamp(timestamp2); - } } contract EigenPodManagerUnitTests_CreationTests is EigenPodManagerUnitTests, IEigenPodManagerEvents { From 5d02d9096c77df1f0a75a47f35d2e030e81e35d1 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 4 Jun 2024 17:29:38 +0000 Subject: [PATCH 20/85] test: fix existing integration tests * test: fix some unit tests and remove many outdated tests * test: start setting up new integration tests --- src/test/EigenPod.t.sol | 1575 +++-------------- src/test/harnesses/EigenPodHarness.sol | 2 +- src/test/integration/IntegrationBase.t.sol | 67 +- .../integration/mocks/BeaconChainMock.t.sol | 53 +- .../VerifyWC_StartCP_CompleteCP.t.sol} | 203 ++- src/test/integration/users/User.t.sol | 406 +++-- src/test/unit/EigenPod-PodManagerUnit.t.sol | 5 +- src/test/unit/EigenPodUnit.t.sol | 12 +- src/test/utils/ProofParsing.sol | 10 +- 9 files changed, 665 insertions(+), 1668 deletions(-) rename src/test/integration/tests/{Test.t.sol => eigenpod/VerifyWC_StartCP_CompleteCP.t.sol} (61%) diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index f5a528580..a5ab9e3b6 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -6,7 +6,7 @@ import "../contracts/pods/DelayedWithdrawalRouter.sol"; import "./utils/ProofParsing.sol"; import "./EigenLayerDeployer.t.sol"; import "../contracts/libraries/BeaconChainProofs.sol"; -import "./mocks/BeaconChainOracleMock.sol"; +import "./integration/mocks/EIP_4788_Oracle_Mock.t.sol"; import "./harnesses/EigenPodHarness.sol"; contract EigenPodTests is ProofParsing, EigenPodPausingConstants { @@ -40,27 +40,27 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { IDelayedWithdrawalRouter public delayedWithdrawalRouter; IETHPOSDeposit public ethPOSDeposit; UpgradeableBeacon public eigenPodBeacon; - EPInternalFunctions public podInternalFunctionTester; + EigenPodHarness public podInternalFunctionTester; + + // BeaconChainOracleMock public beaconChainOracle; + + // EIP-4788 oracle address + EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02); + uint256 constant SINGLE_VALIDATOR_STAKE = 32e18; + // Generated proofs use this EigenPodManager address as the address for Create2 pod deployments + address constant EPM_PROOFGEN_ADDRESS = 0x212224D2F2d262cd093eE13240ca4873fcCBbA3C; - BeaconChainOracleMock public beaconChainOracle; - address[] public slashingContracts; address pauser = address(69); address unpauser = address(489); - address podManagerAddress = 0x212224D2F2d262cd093eE13240ca4873fcCBbA3C; + address podAddress = address(123); - uint256 stakeAmount = 32e18; mapping(address => bool) fuzzedAddressMapping; bytes signature; bytes32 depositDataRoot; - bytes32[] withdrawalFields; - bytes32[] validatorFields; - uint32 WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; IStrategy[] public initializeStrategiesToSetDelayBlocks; uint256[] public initializeWithdrawalDelayBlocks; - uint64 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9; - uint64 RESTAKED_BALANCE_OFFSET_GWEI = 75e7; uint64 internal constant GOERLI_GENESIS_TIME = 1616508000; uint64 internal constant SECONDS_PER_SLOT = 12; @@ -160,10 +160,13 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ethPOSDeposit = new ETHPOSDepositMock(); podImplementation = new EigenPod( ethPOSDeposit, - IEigenPodManager(podManagerAddress), + IEigenPodManager(EPM_PROOFGEN_ADDRESS), GOERLI_GENESIS_TIME ); + // Create mock 4788 oracle + cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode); + eigenPodBeacon = new UpgradeableBeacon(address(podImplementation)); // this contract is deployed later to keep its address the same (for these tests) @@ -171,11 +174,15 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); + // Ensure the EPM's address is consistent so created pods work with proofgen + cheats.etch(EPM_PROOFGEN_ADDRESS, address(eigenPodManager).code); + eigenPodManager = IEigenPodManager(EPM_PROOFGEN_ADDRESS); + // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); StrategyManager strategyManagerImplementation = new StrategyManager( delegation, - IEigenPodManager(podManagerAddress), + eigenPodManager, slasher ); Slasher slasherImplementation = new Slasher(strategyManager, delegation); @@ -187,14 +194,14 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { delegation ); - //ensuring that the address of eigenpodmanager doesn't change - bytes memory code = address(eigenPodManager).code; - cheats.etch(podManagerAddress, code); - eigenPodManager = IEigenPodManager(podManagerAddress); + podInternalFunctionTester = new EigenPodHarness( + ethPOSDeposit, + eigenPodManager, + GOERLI_GENESIS_TIME + ); - beaconChainOracle = new BeaconChainOracleMock(); DelayedWithdrawalRouter delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter( - IEigenPodManager(podManagerAddress) + eigenPodManager ); address initialOwner = address(this); @@ -234,7 +241,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - beaconChainOracle, initialOwner, pauserReg, 0 /*initialPausedStatus*/ @@ -254,7 +260,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ) ); - cheats.deal(address(podOwner), 5 * stakeAmount); + cheats.deal(address(podOwner), 5 * SINGLE_VALIDATOR_STAKE); fuzzedAddressMapping[address(0)] = true; fuzzedAddressMapping[address(eigenLayerProxyAdmin)] = true; @@ -269,44 +275,10 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { IEigenPod newPod = eigenPodManager.getPod(podOwner); cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); } - // function testWithdrawBeforeRestaking() public { - // testStaking(); - // IEigenPod pod = eigenPodManager.getPod(podOwner); - - // //simulate that hasRestaked is set to false, so that we can test withdrawBeforeRestaking for pods deployed before M2 activation - // cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); - // require(pod.hasRestaked() == false, "Pod should not be restaked"); - - // // simulate a withdrawal - // cheats.deal(address(pod), stakeAmount); - // cheats.startPrank(podOwner); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalCreated( - // podOwner, - // podOwner, - // stakeAmount, - // delayedWithdrawalRouter.userWithdrawalsLength(podOwner) - // ); - - // uint timestampBeforeTx = pod.mostRecentWithdrawalTimestamp(); - - // pod.withdrawBeforeRestaking(); - - // require(_getLatestDelayedWithdrawalAmount(podOwner) == stakeAmount, "Payment amount should be stake amount"); - // require( - // pod.mostRecentWithdrawalTimestamp() == uint64(block.timestamp), - // "Most recent withdrawal block number not updated" - // ); - // require( - // pod.mostRecentWithdrawalTimestamp() > timestampBeforeTx, - // "Most recent withdrawal block number not updated" - // ); - // } - function testDeployEigenPodWithoutActivateRestaking() public { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); @@ -316,24 +288,24 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.startPrank(podOwner); cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); bytes32[][] memory validatorFieldsArray = new bytes32[][](1); validatorFieldsArray[0] = getValidatorFields(); bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); + proofsArray[0] = getWithdrawalCredentialProof(); BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); uint40[] memory validatorIndices = new uint40[](1); validatorIndices[0] = uint40(getValidatorIndex()); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); + EIP_4788_ORACLE.setBlockRoot(GOERLI_GENESIS_TIME, getLatestBlockRoot()); //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); cheats.startPrank(podOwner); cheats.warp(GOERLI_GENESIS_TIME); - cheats.expectRevert(bytes("EigenPod.hasEnabledRestaking: restaking is not enabled")); + cheats.expectRevert(bytes("EigenPod.verifyWithdrawalCredentials: restaking not active")); newPod.verifyWithdrawalCredentials( GOERLI_GENESIS_TIME, stateRootProofStruct, @@ -346,72 +318,76 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { // regression test for bug when activateRestaking -> verifyWC occur in the same epoch, in that order function testEigenPodWithdrawalCredentialTimingBug(uint16 epochNum) public { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); + revert("TODO"); + // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - - //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 - cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); - assertTrue(newPod.hasRestaked() == false, "EigenPod should not be restaked"); + // IEigenPod newPod = eigenPodManager.getPod(podOwner); - uint64 startTime = GOERLI_GENESIS_TIME + (BeaconChainProofs.SECONDS_PER_EPOCH * epochNum); - uint64 startEpoch = _timestampToEpoch(startTime); - // move to start time - this is the first slot in the epoch, and is where we will call activateRestaking - cheats.warp(startTime); - - // activate restaking - cheats.startPrank(podOwner); - newPod.startCheckpoint(false); - - // Ensure verifyWC fails for each slot remaining in the epoch - for (uint i = 0; i < 32; i++) { - // Move forward 0-31 slots - uint64 slotTimestamp = uint64(startTime + (BeaconChainProofs.SECONDS_PER_SLOT * i)); - uint64 epoch = _timestampToEpoch(slotTimestamp); - assertTrue(epoch == startEpoch, "calculated epoch should not change"); - - cheats.warp(slotTimestamp); - cheats.expectRevert(bytes("EigenPod.verifyWithdrawalCredentials: proof must be in the epoch after activation")); - newPod.verifyWithdrawalCredentials( - slotTimestamp, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - } - - // finally, move to the next epoch - cheats.warp(block.timestamp + BeaconChainProofs.SECONDS_PER_SLOT); - uint64 endEpoch = _timestampToEpoch(uint64(block.timestamp)); - assertEq(startEpoch + 1, endEpoch, "should have advanced one epoch"); - - // now verifyWC should succeed - newPod.verifyWithdrawalCredentials( - uint64(block.timestamp), - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); + // cheats.startPrank(podOwner); + // cheats.expectEmit(true, true, true, true, address(newPod)); + // emit EigenPodStaked(pubkey); + // eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); + // cheats.stopPrank(); + + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); + // bytes[] memory proofsArray = new bytes[](1); + // proofsArray[0] = getWithdrawalCredentialProof(); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); + // bytes32 beaconBlockRoot = getLatestBlockRoot(); + + // //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 + // cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); + // assertTrue(newPod.hasRestaked() == false, "EigenPod should not be restaked"); + + // uint64 startTime = GOERLI_GENESIS_TIME + (BeaconChainProofs.SECONDS_PER_EPOCH * epochNum); + // uint64 startEpoch = _timestampToEpoch(startTime); + // // move to start time - this is the first slot in the epoch, and is where we will call activateRestaking + // cheats.warp(startTime); + + // // activate restaking + // EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); + // cheats.startPrank(podOwner); + // newPod.startCheckpoint(false); + + // // Ensure verifyWC fails for each slot remaining in the epoch + // for (uint i = 0; i < 32; i++) { + // // Move forward 0-31 slots + // uint64 slotTimestamp = uint64(startTime + (BeaconChainProofs.SECONDS_PER_SLOT * i)); + // uint64 epoch = _timestampToEpoch(slotTimestamp); + // assertTrue(epoch == startEpoch, "calculated epoch should not change"); + + // EIP_4788_ORACLE.setBlockRoot(slotTimestamp, beaconBlockRoot); + // cheats.warp(slotTimestamp); + // cheats.expectRevert(bytes("EigenPod.verifyWithdrawalCredentials: proof must be in the epoch after activation")); + // newPod.verifyWithdrawalCredentials( + // slotTimestamp, + // stateRootProofStruct, + // validatorIndices, + // proofsArray, + // validatorFieldsArray + // ); + // } + + // // finally, move to the next epoch + // cheats.warp(block.timestamp + BeaconChainProofs.SECONDS_PER_SLOT); + // uint64 endEpoch = _timestampToEpoch(uint64(block.timestamp)); + // assertEq(startEpoch + 1, endEpoch, "should have advanced one epoch"); + + // // now verifyWC should succeed + // EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); + // newPod.verifyWithdrawalCredentials( + // uint64(block.timestamp), + // stateRootProofStruct, + // validatorIndices, + // proofsArray, + // validatorFieldsArray + // ); - cheats.stopPrank(); + // cheats.stopPrank(); } function _timestampToEpoch(uint64 timestamp) internal view returns (uint64) { @@ -419,565 +395,100 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return (timestamp - GOERLI_GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; } - // // verifies that it is possible to subsequently prove WCs and withdraw funds when activateRestaking -> validator exit occur in the same epoch, in that order - // // this is similar to `testProveWithdrawalCredentialsAfterValidatorExit` but somewhat more specific / targeted - // function testEigenPodWithdrawalCredentialTimingSuccess() public { - // // upgrade EigenPods to an implementation that has the genesis time to **one slot earlier** - // // we do this so the validator exit at `GOERLI_GENESIS_TIME` is explicitly after genesis time, where we will active restaking - // uint64 modifiedGenesisTime = GOERLI_GENESIS_TIME - 12; - // podImplementation = new EigenPod( - // ethPOSDeposit, - // delayedWithdrawalRouter, - // IEigenPodManager(podManagerAddress), - // MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, - // modifiedGenesisTime - // ); - // eigenPodBeacon.upgradeTo(address(podImplementation)); - - // cheats.startPrank(podOwner); - // IEigenPod newPod = IEigenPod(eigenPodManager.createPod()); - // cheats.stopPrank(); - - // //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 - // cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); - // require(newPod.hasRestaked() == false, "Pod should not be restaked"); - - // // move to slot at modifiedGenesisTime. this is within epoch 0, like the withdrawal - // cheats.warp(modifiedGenesisTime); - // cheats.prank(podOwner); - // newPod.activateRestaking(); - - // // warp forward to start of next epoch (epoch 1), so we can do WC proof with zero effective balance - // cheats.warp(modifiedGenesisTime + BeaconChainProofs.SECONDS_PER_EPOCH); - - // // get proof of validator 302913 having WCs pointed with 0 balance - // // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); - - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - - // bytes[] memory proofsArray = new bytes[](1); - // proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); - - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // //set the oracle block root - // _setOracleBlockRoot(); - - // int256 beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(podOwner); - - // cheats.prank(podOwner); - // newPod.verifyWithdrawalCredentials( - // uint64(block.timestamp), - // stateRootProofStruct, - // validatorIndices, - // proofsArray, - // validatorFieldsArray - // ); - - // int256 beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(podOwner); - // require(beaconChainETHSharesBefore == beaconChainETHSharesAfter, - // "effectiveBalance should be zero, no shares should be credited"); + function testWithdrawNonBeaconChainETHBalanceWei() public { + revert("TODO"); + // IEigenPod pod = testDeployAndVerifyNewEigenPod(); - // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); + // cheats.deal(address(podOwner), 10 ether); + // emit log_named_address("Pod:", address(pod)); - // _proveWithdrawalForPod(newPod); - // } + // uint256 balanceBeforeDeposit = pod.nonBeaconChainETHBalanceWei(); - // function testWithdrawNonBeaconChainETHBalanceWei() public { - // IEigenPod pod = testDeployAndVerifyNewEigenPod(); + // (bool sent, ) = payable(address(pod)).call{value: 1 ether}(""); - // cheats.deal(address(podOwner), 10 ether); - // emit log_named_address("Pod:", address(pod)); + // require(sent == true, "not sent"); - // uint256 balanceBeforeDeposit = pod.nonBeaconChainETHBalanceWei(); + // uint256 balanceAfterDeposit = pod.nonBeaconChainETHBalanceWei(); - // (bool sent, ) = payable(address(pod)).call{value: 1 ether}(""); - - // require(sent == true, "not sent"); - - // uint256 balanceAfterDeposit = pod.nonBeaconChainETHBalanceWei(); - - // require( - // balanceBeforeDeposit < balanceAfterDeposit - // && (balanceAfterDeposit - balanceBeforeDeposit) == 1 ether, - // "increment checks" - // ); + // require( + // balanceBeforeDeposit < balanceAfterDeposit + // && (balanceAfterDeposit - balanceBeforeDeposit) == 1 ether, + // "increment checks" + // ); - // cheats.startPrank(podOwner, podOwner); - // cheats.expectEmit(true, true, true, true, address(pod)); - // emit NonBeaconChainETHWithdrawn(podOwner, 1 ether); - // pod.withdrawNonBeaconChainETHBalanceWei( - // podOwner, - // 1 ether - // ); + // cheats.startPrank(podOwner, podOwner); + // cheats.expectEmit(true, true, true, true, address(pod)); + // emit NonBeaconChainETHWithdrawn(podOwner, 1 ether); + // pod.withdrawNonBeaconChainETHBalanceWei( + // podOwner, + // 1 ether + // ); - // uint256 balanceAfterWithdrawal = pod.nonBeaconChainETHBalanceWei(); + // uint256 balanceAfterWithdrawal = pod.nonBeaconChainETHBalanceWei(); - // require( - // balanceAfterWithdrawal < balanceAfterDeposit - // && balanceAfterWithdrawal == balanceBeforeDeposit, - // "decrement checks" - // ); + // require( + // balanceAfterWithdrawal < balanceAfterDeposit + // && balanceAfterWithdrawal == balanceBeforeDeposit, + // "decrement checks" + // ); - // cheats.stopPrank(); - // } + // cheats.stopPrank(); + } - // function testWithdrawFromPod() public { - // IEigenPod pod = eigenPodManager.getPod(podOwner); + function testDeployAndVerifyNewEigenPod() public returns (IEigenPod) { + // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); + return _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); + } + + // /// @notice Similar test done in EP unit test + // //test deploying an eigen pod with mismatched withdrawal credentials between the proof and the actual pod's address + // function testDeployNewEigenPodWithWrongWithdrawalCreds(address wrongWithdrawalAddress) public { + // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" + // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); // cheats.startPrank(podOwner); - - // cheats.expectEmit(true, true, true, true, address(pod)); + // IEigenPod newPod; + // newPod = eigenPodManager.getPod(podOwner); + // cheats.expectEmit(true, true, true, true, address(newPod)); // emit EigenPodStaked(pubkey); - - // eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + // eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); // cheats.stopPrank(); - // cheats.deal(address(pod), stakeAmount); - - // // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert - // cheats.store(address(pod), bytes32(uint256(52)), bytes32(uint256(1))); - - // cheats.startPrank(podOwner); - // uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(podOwner); - // // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // //cheats.expectEmit(true, true, true, true); - // emit DelayedWithdrawalCreated(podOwner, podOwner, stakeAmount, userWithdrawalsLength); - // pod.withdrawBeforeRestaking(); - // cheats.stopPrank(); - // require(address(pod).balance == 0, "Pod balance should be 0"); - // } - - // function testFullWithdrawalProof() public { - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // BeaconChainProofs.WithdrawalProof memory proofs = _getWithdrawalProof(); - // bytes32 beaconStateRoot = getBeaconStateRoot(); - // withdrawalFields = getWithdrawalFields(); - // validatorFields = getValidatorFields(); - - // Relayer relay = new Relayer(); - - // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs); - // } - - // function testFullWithdrawalProofWithWrongIndices( - // uint64 wrongBlockRootIndex, - // uint64 wrongWithdrawalIndex, - // uint64 wrongHistoricalSummariesIndex - // ) public { - // uint256 BLOCK_ROOTS_TREE_HEIGHT = 13; - // uint256 WITHDRAWALS_TREE_HEIGHT = 4; - // uint256 HISTORICAL_SUMMARIES_TREE_HEIGHT = 24; - // cheats.assume(wrongBlockRootIndex > 2 ** BLOCK_ROOTS_TREE_HEIGHT); - // cheats.assume(wrongWithdrawalIndex > 2 ** WITHDRAWALS_TREE_HEIGHT); - // cheats.assume(wrongHistoricalSummariesIndex > 2 ** HISTORICAL_SUMMARIES_TREE_HEIGHT); - - // Relayer relay = new Relayer(); - - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // bytes32 beaconStateRoot = getBeaconStateRoot(); - // validatorFields = getValidatorFields(); - // withdrawalFields = getWithdrawalFields(); - - // { - // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - // wrongProofs.blockRootIndex = wrongBlockRootIndex; - // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: blockRootIndex is too large")); - // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - // } - - // { - // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - // wrongProofs.withdrawalIndex = wrongWithdrawalIndex; - // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: withdrawalIndex is too large")); - // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - // } - - // { - // BeaconChainProofs.WithdrawalProof memory wrongProofs = _getWithdrawalProof(); - // wrongProofs.historicalSummaryIndex = wrongHistoricalSummariesIndex; - // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: historicalSummaryIndex is too large")); - // relay.verifyWithdrawal(beaconStateRoot, withdrawalFields, wrongProofs); - // } - // } - - /// @notice This test is to ensure the full withdrawal flow works - // function testFullWithdrawalFlowDeneb() public returns (IEigenPod) { - // eigenPodManager.setDenebForkTimestamp(DENEB_FORK_TIMESTAMP_GOERLI); - // IS_DENEB = true; - // //this call is to ensure that validator 302913 has proven their withdrawalcreds - // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false false - // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - // setJSON("./src/test/test-data/fullWithdrawalDeneb.json"); - // return _proveWithdrawalForPod(newPod); - // } - - // function testFullWithdrawalFlowCapellaWithdrawalAgainstDenebRoot() public returns (IEigenPod) { - // IS_DENEB = false; - // //this call is to ensure that validator 302913 has proven their withdrawalcreds - // // ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/goerli_slot_6397952.json" "data/goerli_block_header_6397852.json" "data/goerli_block_6397852.json" "fullWithdrawalProof_CapellaAgainstDeneb.json" false true - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // //Deneb: ./solidityProofGen/solidityProofGen "WithdrawalFieldsProof" 302913 271 8191 true false "data/deneb_goerli_block_header_7431952.json" "data/deneb_goerli_slot_7431952.json" "data/deneb_goerli_slot_7421952.json" "data/deneb_goerli_block_header_7421951.json" "data/deneb_goerli_block_7421951.json" "fullWithdrawalProof_Latest.json" false - // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - // setJSON("./src/test/test-data/fullWithdrawalCapellaAgainstDenebRoot.json"); - // return _proveWithdrawalForPod(newPod); - // } - // function testFullWithdrawalFlow() public returns (IEigenPod) { - // //this call is to ensure that validator 302913 has proven their withdrawalcreds - // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // return _proveWithdrawalForPod(newPod); - // } + // // make sure that wrongWithdrawalAddress is not set to actual pod address + // cheats.assume(wrongWithdrawalAddress != address(newPod)); - /** - * @notice this test is to ensure that a full withdrawal can be made once a validator has processed their first full withrawal - * This is specifically for the case where a validator has redeposited into their exited validator and needs to prove another withdrawal - * to get their funds out - */ - // function testWithdrawAfterFullWithdrawal() external { - // _deployInternalFunctionTester(); - // IEigenPod pod = testFullWithdrawalFlow(); - - // // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest_1SlotAdvanced.json" true - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest_1SlotAdvanced.json"); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - - // withdrawalFields = getWithdrawalFields(); - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // uint64 leftOverBalanceWEI = uint64( - // withdrawalAmountGwei - pod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() - // ) * uint64(GWEI_TO_WEI); - // cheats.deal(address(pod), leftOverBalanceWEI); - // { - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - // 1 - // ); - // withdrawalProofsArray[0] = _getWithdrawalProof(); - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // pod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // } - // } - - // function testProvingFullWithdrawalForTheSameSlotFails() external { - // IEigenPod pod = testFullWithdrawalFlow(); - - // { - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - // 1 - // ); - // withdrawalProofsArray[0] = _getWithdrawalProof(); - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // cheats.expectRevert( - // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - // ); - // pod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // } - // } + // bytes32[] memory validatorFields = getValidatorFields(); + // validatorFields[1] = abi.encodePacked(bytes1(uint8(1)), bytes11(0), wrongWithdrawalAddress).toBytes32(0); - /// @notice This test is to ensure that the partial withdrawal flow works correctly - // function testPartialWithdrawalFlow() public returns (IEigenPod) { - // //this call is to ensure that validator 61068 has proven their withdrawalcreds - // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // //generate partialWithdrawalProofs.json with: - // // ./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "partialWithdrawalProof_Latest.json" false - // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - // withdrawalFields = getWithdrawalFields(); - // validatorFields = getValidatorFields(); - // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // uint40 validatorIndex = uint40( - // Endian.fromLittleEndianUint64(withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_INDEX_INDEX]) - // ); - - // cheats.deal(address(newPod), stakeAmount); - // { - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - // 1 - // ); - // withdrawalProofsArray[0] = withdrawalProofs; - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = validatorFieldsProof; - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = validatorFields; - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // //cheats.expectEmit(true, true, true, true, address(newPod)); - // // cheats.expectEmit(validatorIndex, _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), podOwner, withdrawalAmountGwei, address(newPod)); - // emit PartialWithdrawalRedeemed( - // validatorIndex, - // _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)), - // podOwner, - // withdrawalAmountGwei - // ); - // newPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // require( - // newPod.provenWithdrawal( - // validatorFields[0], - // _computeTimestampAtSlot(Endian.fromLittleEndianUint64(withdrawalProofs.slotRoot)) - // ), - // "provenPartialWithdrawal should be true" - // ); - // withdrawalAmountGwei = uint64(withdrawalAmountGwei * GWEI_TO_WEI); - // require( - // address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == - // withdrawalAmountGwei, - // "pod delayed withdrawal balance hasn't been updated correctly" - // ); - // } - - // cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); - // uint256 podOwnerBalanceBefore = address(podOwner).balance; - // delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); - // require( - // address(podOwner).balance - podOwnerBalanceBefore == withdrawalAmountGwei, - // "Pod owner balance hasn't been updated correctly" - // ); - // return newPod; - // } - - /// @notice verifies that multiple partial withdrawals can be made before a full withdrawal - // function testProvingMultiplePartialWithdrawalsForSameSlot() public /*uint256 numPartialWithdrawals*/ { - // IEigenPod newPod = testPartialWithdrawalFlow(); - - // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - // withdrawalFields = getWithdrawalFields(); - // validatorFields = getValidatorFields(); - - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); - // withdrawalProofsArray[0] = withdrawalProofs; - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = validatorFieldsProof; // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); // validatorFieldsArray[0] = validatorFields; - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // cheats.expectRevert( - // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - // ); - // newPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // } + // bytes[] memory proofsArray = new bytes[](1); + // proofsArray[0] = getWithdrawalCredentialProof(); + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(validatorIndex0); - /// @notice verifies that multiple full withdrawals for a single validator fail - // function testDoubleFullWithdrawal() public returns (IEigenPod newPod) { - // newPod = testFullWithdrawalFlow(); - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * - // uint64(GWEI_TO_WEI); - // cheats.deal(address(newPod), leftOverBalanceWEI); - - // BeaconChainProofs.WithdrawalProof memory withdrawalProofs = _getWithdrawalProof(); - // bytes memory validatorFieldsProof = abi.encodePacked(getValidatorProof()); - // withdrawalFields = getWithdrawalFields(); - // validatorFields = getValidatorFields(); - - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); - // withdrawalProofsArray[0] = withdrawalProofs; - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = validatorFieldsProof; - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = validatorFields; - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; + // cheats.startPrank(podOwner); + // if (!newPod.hasRestaked()) { + // newPod.startCheckpoint(false); + // } + // // set oracle block root + // _setOracleBlockRoot(); // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // cheats.expectRevert( - // bytes("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp") - // ); - // newPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - - // return newPod; - // } - - function testDeployAndVerifyNewEigenPod() public returns (IEigenPod) { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - return _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - } + // uint64 timestamp = _verifyWCStartTimestamp(newPod); + // cheats.warp(timestamp); - // // test freezing operator after a beacon chain slashing event - // function testUpdateSlashedBeaconBalance() public { - // _deployInternalFunctionTester(); - // //make initial deposit - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // cheats.warp(block.timestamp + 1); - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // _proveOverCommittedStake(newPod); - - // uint64 newValidatorBalance = _getValidatorUpdatedBalance(); - // int256 beaconChainETHShares = eigenPodManager.podOwnerShares(podOwner); - - // require( - // beaconChainETHShares == int256((newValidatorBalance) * GWEI_TO_WEI), - // "eigenPodManager shares not updated correctly" + // cheats.expectRevert(bytes("EigenPod.verifyCorrectWithdrawalCredentials: Proof is not for this EigenPod")); + // newPod.verifyWithdrawalCredentials( + // timestamp, + // stateRootProofStruct, + // validatorIndices, + // proofsArray, + // validatorFieldsArray // ); - // } - - /// @notice Similar test done in EP unit test - //test deploying an eigen pod with mismatched withdrawal credentials between the proof and the actual pod's address - function testDeployNewEigenPodWithWrongWithdrawalCreds(address wrongWithdrawalAddress) public { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - cheats.startPrank(podOwner); - IEigenPod newPod; - newPod = eigenPodManager.getPod(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - - - // make sure that wrongWithdrawalAddress is not set to actual pod address - cheats.assume(wrongWithdrawalAddress != address(newPod)); - - validatorFields = getValidatorFields(); - validatorFields[1] = abi.encodePacked(bytes1(uint8(1)), bytes11(0), wrongWithdrawalAddress).toBytes32(0); - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = validatorFields; - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(validatorIndex0); - - cheats.startPrank(podOwner); - if (!newPod.hasRestaked()) { - newPod.startCheckpoint(false); - } - // set oracle block root - _setOracleBlockRoot(); - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - uint64 timestamp = _verifyWCStartTimestamp(newPod); - cheats.warp(timestamp); - - cheats.expectRevert(bytes("EigenPod.verifyCorrectWithdrawalCredentials: Proof is not for this EigenPod")); - newPod.verifyWithdrawalCredentials( - timestamp, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - cheats.stopPrank(); - } - //ensures that a validator proving WC after they have exited the beacon chain is allowed to - //prove their WC and process a withdrawal - // function testProveWithdrawalCredentialsAfterValidatorExit() public { - // // ./solidityProofGen -newBalance=0 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913_exited.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_exited.json"); - // emit log("hello"); - - // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // //./solidityProofGen "WithdrawalFieldsProof" 302913 146 8092 true false "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6397852.json" "data/withdrawal_proof_goerli/goerli_block_header_6397852.json" "data/withdrawal_proof_goerli/goerli_block_6397852.json" "fullWithdrawalProof_Latest.json" false - // // To get block header: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v1/beacon/headers/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_header_6399000.json - // // To get block: curl -H "Accept: application/json" 'https://eigenlayer.spiceai.io/goerli/beacon/eth/v2/beacon/blocks/6399000?api_key\="343035|f6ebfef661524745abb4f1fd908a76e8"' > block_6399000.json - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _proveWithdrawalForPod(newPod); + // cheats.stopPrank(); // } function testVerifyWithdrawalCredsFromNonPodOwnerAddress(address nonPodOwnerAddress) public { @@ -991,13 +502,13 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); bytes32[][] memory validatorFieldsArray = new bytes32[][](1); validatorFieldsArray[0] = getValidatorFields(); bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); + proofsArray[0] = getWithdrawalCredentialProof(); uint40[] memory validatorIndices = new uint40[](1); validatorIndices[0] = uint40(validatorIndex0); @@ -1018,40 +529,37 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - // function testBalanceProofWithWrongTimestamp(uint64 timestamp) public { - // cheats.assume(timestamp > GOERLI_GENESIS_TIME); - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // IEigenPod newPod = testDeployAndVerifyNewEigenPod(); - - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // // prove overcommitted balance - // cheats.warp(timestamp); - // _proveOverCommittedStake(newPod); + function testBalanceProofWithWrongTimestamp(uint64 timestamp) public { + revert("TODO"); + // cheats.assume(timestamp > GOERLI_GENESIS_TIME); + // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); + // IEigenPod newPod = testDeployAndVerifyNewEigenPod(); + // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" + // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); + // // prove overcommitted balance + // cheats.warp(timestamp); + // _proveOverCommittedStake(newPod); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); + // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); + // validatorFieldsArray[0] = getValidatorFields(); - // bytes memory proof = abi.encodePacked(getBalanceUpdateProof()); - // bytes[] memory proofs = new bytes[](1); - // proofs[0] = proof; + // uint40[] memory validatorIndices = new uint40[](1); + // validatorIndices[0] = uint40(getValidatorIndex()); - // bytes32 newLatestBlockRoot = getLatestBlockRoot(); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + // bytes memory proof = abi.encodePacked(getBalanceUpdateProof()); + // bytes[] memory proofs = new bytes[](1); + // proofs[0] = proof; - // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp")); - // newPod.verifyBalanceUpdates(uint64(block.timestamp - 1), validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); - // } + // bytes32 newLatestBlockRoot = getLatestBlockRoot(); + // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); + // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // // 3. Single withdrawal credential - // // Test: Owner proves an withdrawal credential. - // // validator status should be marked as ACTIVE + // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp")); + // newPod.verifyBalanceUpdates(uint64(block.timestamp - 1), validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); + } function testProveSingleWithdrawalCredential() public { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" @@ -1065,97 +573,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ); } - // 5. Prove overcommitted balance - // Setup: Run (3). - // Test: Watcher proves an overcommitted balance for validator from (3). - // validator status should be marked as OVERCOMMITTED - - // function testProveOverCommittedBalance() public { - // _deployInternalFunctionTester(); - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // // get beaconChainETH shares - // int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); - - // bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - // uint256 validatorRestakedBalanceBefore = newPod - // .validatorPubkeyHashToInfo(validatorPubkeyHash) - // .restakedBalanceGwei; - - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // // prove overcommitted balance - // cheats.warp(block.timestamp + 1); - // _proveOverCommittedStake(newPod); - - // uint256 validatorRestakedBalanceAfter = newPod - // .validatorPubkeyHashToInfo(validatorPubkeyHash) - // .restakedBalanceGwei; - - // uint64 newValidatorBalance = _getValidatorUpdatedBalance(); - // int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); - // assertTrue( - // eigenPodManager.podOwnerShares(podOwner) == - // int256(newValidatorBalance * GWEI_TO_WEI), - // "hysterisis not working" - // ); - // assertTrue( - // beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, - // "BeaconChainETHShares not updated" - // ); - // assertTrue( - // int256(validatorRestakedBalanceBefore) - int256(validatorRestakedBalanceAfter) == - // shareDiff / int256(GWEI_TO_WEI), - // "validator restaked balance not updated" - // ); - // } - - // function testVerifyUndercommittedBalance() public { - // _deployInternalFunctionTester(); - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - // // get beaconChainETH shares - // int256 beaconChainETHBefore = eigenPodManager.podOwnerShares(podOwner); - // bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - // uint256 validatorRestakedBalanceBefore = newPod - // .validatorPubkeyHashToInfo(validatorPubkeyHash) - // .restakedBalanceGwei; - - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // // prove overcommitted balance - // cheats.warp(block.timestamp + 1); - // _proveOverCommittedStake(newPod); - - // cheats.warp(block.timestamp + 1); - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 100 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913_incrementedBlockBy100.json"); - // _proveUnderCommittedStake(newPod); - - // uint256 validatorRestakedBalanceAfter = newPod - // .validatorPubkeyHashToInfo(validatorPubkeyHash) - // .restakedBalanceGwei; - - // int256 shareDiff = beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner); - - // assertTrue( - // eigenPodManager.podOwnerShares(podOwner) == - // int256((MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * GWEI_TO_WEI), - // "hysterisis not working" - // ); - // assertTrue( - // beaconChainETHBefore - eigenPodManager.podOwnerShares(podOwner) == shareDiff, - // "BeaconChainETHShares not updated" - // ); - // assertTrue( - // int256(uint256(validatorRestakedBalanceBefore)) - int256(uint256(validatorRestakedBalanceAfter)) == - // shareDiff / int256(GWEI_TO_WEI), - // "validator restaked balance not updated" - // ); - // } - function testDeployingEigenPodRevertsWhenPaused() external { // pause the contract cheats.startPrank(pauser); @@ -1164,7 +581,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.startPrank(podOwner); cheats.expectRevert(bytes("Pausable: index is paused")); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); } @@ -1195,62 +612,28 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { IEigenPod newPod = eigenPodManager.getPod(podOwner); cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); - cheats.deal(nonPodManager, stakeAmount); + cheats.deal(nonPodManager, SINGLE_VALIDATOR_STAKE); cheats.startPrank(nonPodManager); cheats.expectRevert(bytes("EigenPod.onlyEigenPodManager: not eigenPodManager")); - newPod.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + newPod.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); } - // function testCallWithdrawBeforeRestakingFromNonOwner(address nonPodOwner) external fuzzedAddress(nonPodOwner) { - // cheats.assume(nonPodOwner != podOwner); - // testStaking(); - // IEigenPod pod = eigenPodManager.getPod(podOwner); - - // // this is testing if pods deployed before M2 that do not have hasRestaked initialized to true, will revert - // cheats.store(address(pod), bytes32(uint256(52)), bytes32(0)); - // require(pod.hasRestaked() == false, "Pod should not be restaked"); - - // //simulate a withdrawal - // cheats.startPrank(nonPodOwner); - // cheats.expectRevert(bytes("EigenPod.onlyEigenPodOwner: not podOwner")); - // pod.withdrawBeforeRestaking(); - // } - - /* test deprecated since this is checked on the EigenPodManager level, rather than the EigenPod level - TODO: @Sidu28 - check whether we have adequate coverage of the correct function - function testWithdrawRestakedBeaconChainETHRevertsWhenPaused() external { - // pause the contract - cheats.startPrank(pauser); - eigenPodManager.pause(2 ** PAUSED_WITHDRAW_RESTAKED_ETH); - cheats.stopPrank(); - - address recipient = address(this); - uint256 amount = 1e18; - IEigenPod eigenPod = eigenPodManager.getPod(podOwner); - cheats.startPrank(address(eigenPodManager)); - cheats.expectRevert(bytes("Pausable: index is paused")); - eigenPod.withdrawRestakedBeaconChainETH(recipient, amount); - cheats.stopPrank(); - } - */ - function testVerifyCorrectWithdrawalCredentialsRevertsWhenPaused() external { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); bytes32 newBeaconStateRoot = getBeaconStateRoot(); - BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newBeaconStateRoot); - + IEigenPod newPod = eigenPodManager.getPod(podOwner); cheats.startPrank(podOwner); cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); cheats.stopPrank(); // pause the contract @@ -1262,7 +645,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { validatorFieldsArray[0] = getValidatorFields(); bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); + proofsArray[0] = getWithdrawalCredentialProof(); BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); @@ -1271,6 +654,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { uint64 timestamp = _verifyWCStartTimestamp(newPod); cheats.warp(timestamp); + EIP_4788_ORACLE.setBlockRoot(timestamp, newBeaconStateRoot); cheats.startPrank(podOwner); cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); @@ -1284,81 +668,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - // function testVerifyOvercommittedStakeRevertsWhenPaused() external { - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // IEigenPod newPod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - - // bytes[] memory proofs = new bytes[](1); - // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - - // bytes32 newBeaconStateRoot = getBeaconStateRoot(); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newBeaconStateRoot); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // // pause the contract - // cheats.startPrank(pauser); - // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); - // cheats.stopPrank(); - - // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - // newPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); - // } - - // function _proveOverCommittedStake(IEigenPod newPod) internal { - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - - // bytes[] memory proofs = new bytes[](1); - // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - - // bytes32 newLatestBlockRoot = getLatestBlockRoot(); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // newPod.verifyBalanceUpdates( - // uint64(block.timestamp), - // validatorIndices, - // stateRootProofStruct, - // proofs, - // validatorFieldsArray - // ); - // } - - // function _proveUnderCommittedStake(IEigenPod newPod) internal { - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - - // bytes[] memory proofs = new bytes[](1); - // proofs[0] = abi.encodePacked(getBalanceUpdateProof()); - - // bytes32 newLatestBlockRoot = getLatestBlockRoot(); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // newPod.verifyBalanceUpdates( - // uint64(block.timestamp), - // validatorIndices, - // stateRootProofStruct, - // proofs, - // validatorFieldsArray - // ); - // require(newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).status == IEigenPod.VALIDATOR_STATUS.ACTIVE); - // } - function _getValidatorUpdatedBalance() internal returns (uint64) { bytes32[] memory validatorFieldsToGet = getValidatorFields(); return validatorFieldsToGet.getEffectiveBalanceGwei(); @@ -1460,33 +769,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { require(status1 == status2, "status does not match"); } - /* TODO: reimplement similar tests - function testQueueBeaconChainETHWithdrawalWithoutProvingFullWithdrawal() external { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - uint256 shareAmount = 32e18; - // expect revert from underflow - cheats.expectRevert(); - _testQueueWithdrawal(podOwner, shareAmount); - } - - function testQueueBeaconChainETHWithdrawal() external { - IEigenPod pod = testFullWithdrawalFlow(); - - bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - - uint256 withdrawableRestakedExecutionLayerGweiBefore = pod.withdrawableRestakedExecutionLayerGwei(); - - uint256 shareAmount = (pod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * GWEI_TO_WEI; - _verifyEigenPodBalanceSharesInvariant(podOwner, pod, validatorPubkeyHash); - _testQueueWithdrawal(podOwner, shareAmount); - _verifyEigenPodBalanceSharesInvariant(podOwner, pod, validatorPubkeyHash); - - require(withdrawableRestakedExecutionLayerGweiBefore - pod.withdrawableRestakedExecutionLayerGwei() == shareAmount/int256(GWEI_TO_WEI), - "withdrawableRestakedExecutionLayerGwei not decremented correctly"); - } -*/ function _verifyEigenPodBalanceSharesInvariant( address podowner, IEigenPod pod, @@ -1505,71 +787,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { ); } - // function _proveWithdrawalForPod(IEigenPod newPod) internal returns (IEigenPod) { - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(getLatestBlockRoot()); - // uint64 restakedExecutionLayerGweiBefore = newPod.withdrawableRestakedExecutionLayerGwei(); - - // withdrawalFields = getWithdrawalFields(); - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); - // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR()) * - // uint64(GWEI_TO_WEI); - // cheats.deal(address(newPod), leftOverBalanceWEI); - // emit log_named_uint("leftOverBalanceWEI", leftOverBalanceWEI); - // emit log_named_uint("address(newPod)", address(newPod).balance); - // emit log_named_uint("withdrawalAmountGwei", withdrawalAmountGwei); - - // uint256 delayedWithdrawalRouterContractBalanceBefore = address(delayedWithdrawalRouter).balance; - // { - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[]( - // 1 - // ); - // withdrawalProofsArray[0] = _getWithdrawalProof(); - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // validatorFieldsProofArray[0] = abi.encodePacked(getValidatorProof()); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // newPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // } - // require( - // newPod.withdrawableRestakedExecutionLayerGwei() - restakedExecutionLayerGweiBefore == - // newPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR(), - // "restakedExecutionLayerGwei has not been incremented correctly" - // ); - // require( - // address(delayedWithdrawalRouter).balance - delayedWithdrawalRouterContractBalanceBefore == - // leftOverBalanceWEI, - // "pod delayed withdrawal balance hasn't been updated correctly" - // ); - // require( - // newPod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()).restakedBalanceGwei == 0, - // "balance not reset correctly" - // ); - - // cheats.roll(block.number + WITHDRAWAL_DELAY_BLOCKS + 1); - // uint256 podOwnerBalanceBefore = address(podOwner).balance; - // delayedWithdrawalRouter.claimDelayedWithdrawals(podOwner, 1); - // require( - // address(podOwner).balance - podOwnerBalanceBefore == leftOverBalanceWEI, - // "Pod owner balance hasn't been updated correctly" - // ); - // return newPod; - // } - // simply tries to register 'sender' as a delegate, setting their 'DelegationTerms' contract in DelegationManager to 'dt' // verifies that the storage of DelegationManager contract is updated appropriately function _testRegisterAsOperator( @@ -1642,6 +859,23 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { (updatedStrategies, updatedShares) = strategyManager.getDeposits(staker); } + function _newPod_VerifiedWC( + address _podOwner, + bytes memory _signature, + bytes32 _depositDataRoot + ) internal returns (IEigenPod) { + IEigenPod pod = eigenPodManager.getPod(_podOwner); + + cheats.prank(_podOwner); + cheats.expectEmit(true, true, true, true, address(pod)); + emit EigenPodStaked(pubkey); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, _signature, _depositDataRoot); + + _verifyWithdrawalCredentials(pod, _podOwner); + + return pod; + } + function _testDeployAndVerifyNewEigenPod( address _podOwner, bytes memory _signature, @@ -1652,78 +886,52 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.startPrank(_podOwner); cheats.expectEmit(true, true, true, true, address(newPod)); emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: stakeAmount}(pubkey, _signature, _depositDataRoot); + eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, _signature, _depositDataRoot); cheats.stopPrank(); - return _verifyWithdrawalCredentials(newPod, _podOwner); - } - - function _verifyWithdrawalCredentials(IEigenPod newPod, address _podOwner) internal returns (IEigenPod) { - _deployInternalFunctionTester(); - uint64 timestamp = EigenPod(payable(address(newPod))).GENESIS_TIME(); - // cheats.expectEmit(true, true, true, true, address(newPod)); - // emit ValidatorRestaked(validatorIndex); - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); + _verifyWithdrawalCredentials(newPod, _podOwner); - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = abi.encodePacked(getWithdrawalCredentialProof()); + return newPod; + } - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); + function _verifyWithdrawalCredentials(IEigenPod pod, address _podOwner) internal { + cheats.startPrank(podOwner); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); + ( + bytes32 beaconBlockRoot, + BeaconChainProofs.StateRootProof memory stateRootProof, + uint40[] memory validatorIndices, + bytes[] memory validatorFieldsProofs, + bytes32[][] memory validatorFields + ) = _getWithdrawalCredentialProof(); - int256 beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(_podOwner); + // Set the 4788 oracle block root + EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); - cheats.startPrank(_podOwner); - cheats.warp(timestamp); - if (newPod.hasRestaked() == false) { - newPod.startCheckpoint(false); - } - //set the oracle block root - _setOracleBlockRoot(); + int beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(_podOwner); - emit log_named_bytes32( - "restaking activated", - BeaconChainOracleMock(address(beaconChainOracle)).mockBeaconChainStateRoot() - ); + emit log_named_address("pod", address(pod)); + emit log_named_bytes32("wc", BeaconChainProofs.getWithdrawalCredentials(validatorFields[0])); - timestamp = _verifyWCStartTimestamp(newPod); - cheats.warp(timestamp); - newPod.verifyWithdrawalCredentials( - timestamp, - stateRootProofStruct, + pod.verifyWithdrawalCredentials( + uint64(block.timestamp), + stateRootProof, validatorIndices, - proofsArray, - validatorFieldsArray + validatorFieldsProofs, + validatorFields ); - cheats.stopPrank(); - int256 beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(_podOwner); - uint256 effectiveBalance = uint256(Endian.fromLittleEndianUint64(validatorFieldsArray[0][2]) * GWEI_TO_WEI); - - emit log_named_uint("effectiveBalance", effectiveBalance); - emit log_named_uint("MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR", MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR * GWEI_TO_WEI); - emit log_named_uint("beaconChainETHSharesAfter", uint256(beaconChainETHSharesAfter)); - emit log_named_uint("beaconChainETHSharesBefore", uint256(beaconChainETHSharesBefore)); - - if(effectiveBalance < MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR * GWEI_TO_WEI){ - require( - (beaconChainETHSharesAfter - beaconChainETHSharesBefore) == int256(effectiveBalance), - "eigenPodManager shares not updated correctly" - ); - } else { - emit log("here)"); - require( - (beaconChainETHSharesAfter - beaconChainETHSharesBefore) == int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR * GWEI_TO_WEI)), - "eigenPodManager shares not updated correctly" - ); - emit log("here)"); + int beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(_podOwner); + uint effectiveBalanceWei = uint(BeaconChainProofs.getEffectiveBalanceGwei(validatorFields[0])) * GWEI_TO_WEI; - } - return newPod; + emit log_named_uint("effectiveBalance (wei)", effectiveBalanceWei); + emit log_named_uint("beaconChainETHSharesAfter", uint(beaconChainETHSharesAfter)); + emit log_named_uint("beaconChainETHSharesBefore", uint(beaconChainETHSharesBefore)); + + assertEq(beaconChainETHSharesBefore + int(effectiveBalanceWei), beaconChainETHSharesAfter, + "_verifyWithdrawalCredentials: shares not updated correctly"); + + cheats.stopPrank(); } function _verifyWCStartTimestamp(IEigenPod pod) internal returns (uint64) { @@ -1752,24 +960,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return genesisTime + ((1 + epoch) * BeaconChainProofs.SECONDS_PER_EPOCH); } - /* TODO: reimplement similar tests - function _testQueueWithdrawal( - address _podOwner, - uint256 amountWei - ) - internal - returns (bytes32) - { - //make a call from _podOwner to queue the withdrawal - cheats.startPrank(_podOwner); - bytes32 withdrawalRoot = eigenPodManager.queueWithdrawal( - amountWei, - _podOwner - ); - cheats.stopPrank(); - return withdrawalRoot; - } -*/ function _getLatestDelayedWithdrawalAmount(address recipient) internal view returns (uint256) { return delayedWithdrawalRouter @@ -1778,249 +968,38 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { } function _getStateRootProof() internal returns (BeaconChainProofs.StateRootProof memory) { - return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), abi.encodePacked(getStateRootProof())); - } + return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), getStateRootProof()); + } + + /// @dev Read various proving parameters from JSON + function _getWithdrawalCredentialProof() + internal + returns ( + bytes32 beaconBlockRoot, + BeaconChainProofs.StateRootProof memory stateRootProof, + uint40[] memory validatorIndices, + bytes[] memory validatorFieldsProofs, + bytes32[][] memory validatorFields + ) + { + beaconBlockRoot = getLatestBlockRoot(); - // /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - // IEigenPod newPod = eigenPodManager.getPod(podOwner); + stateRootProof = BeaconChainProofs.StateRootProof({ + beaconStateRoot: getBeaconStateRoot(), + proof: getStateRootProof() + }); - // //make initial deposit - // cheats.startPrank(podOwner); - // cheats.expectEmit(true, true, true, true, address(newPod)); - // emit EigenPodStaked(pubkey); - // eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - // cheats.stopPrank(); + validatorIndices = new uint40[](1); + validatorIndices[0] = uint40(getValidatorIndex()); - // if(!IS_DENEB){ - // emit log("NOT DENEB"); - // } - // bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); - // bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); - // { - // bytes32 blockRoot = getBlockRoot(); - // bytes32 slotRoot = getSlotRoot(); - // bytes32 timestampRoot = getTimestampRoot(); - // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - // return - // BeaconChainProofs.WithdrawalProof( - // abi.encodePacked(withdrawalProof), - // abi.encodePacked(getSlotProof()), - // abi.encodePacked(getExecutionPayloadProof()), - // abi.encodePacked(timestampProof), - // abi.encodePacked(getHistoricalSummaryProof()), - // uint64(getBlockRootIndex()), - // uint64(getHistoricalSummaryIndex()), - // uint64(getWithdrawalIndex()), - // blockRoot, - // slotRoot, - // timestampRoot, - // executionPayloadRoot - // ); - // } - // } - + validatorFieldsProofs = new bytes[](1); + validatorFieldsProofs[0] = getWithdrawalCredentialProof(); - function _setOracleBlockRoot() internal { - bytes32 latestBlockRoot = getLatestBlockRoot(); - //set beaconStateRoot - beaconChainOracle.setOracleBlockRootAtTimestamp(latestBlockRoot); + validatorFields = new bytes32[][](1); + validatorFields[0] = getValidatorFields(); } function _computeTimestampAtSlot(uint64 slot) internal pure returns (uint64) { return uint64(GOERLI_GENESIS_TIME + slot * SECONDS_PER_SLOT); } - - function _deployInternalFunctionTester() internal { - podInternalFunctionTester = new EPInternalFunctions( - ethPOSDeposit, - IEigenPodManager(podManagerAddress), - GOERLI_GENESIS_TIME - ); - } -} - -// contract Relayer is Test { -// function verifyWithdrawal( -// bytes32 beaconStateRoot, -// bytes32[] calldata withdrawalFields, -// BeaconChainProofs.WithdrawalProof calldata proofs -// ) public view { -// BeaconChainProofs.verifyWithdrawal(beaconStateRoot, withdrawalFields, proofs, type(uint64).max); -// } -// } - - -//TODO: Integration Tests from old EPM unit tests: - // queues a withdrawal of "beacon chain ETH shares" from this address to itself - // fuzzed input amountGwei is sized-down, since it must be in GWEI and gets sized-up to be WEI -// TODO: reimplement similar test - // function testQueueWithdrawalBeaconChainETHToSelf(uint128 amountGwei) - // public returns (IEigenPodManager.BeaconChainQueuedWithdrawal memory, bytes32 /*withdrawalRoot*/) - // { - // // scale fuzzed amount up to be a whole amount of GWEI - // uint256 amount = uint256(amountGwei) * 1e9; - // address staker = address(this); - // address withdrawer = staker; - - // testRestakeBeaconChainETHSuccessfully(staker, amount); - - // (IEigenPodManager.BeaconChainQueuedWithdrawal memory queuedWithdrawal, bytes32 withdrawalRoot) = - // _createQueuedWithdrawal(staker, amount, withdrawer); - - // return (queuedWithdrawal, withdrawalRoot); - // } -// TODO: reimplement similar test - // function testQueueWithdrawalBeaconChainETHToDifferentAddress(address withdrawer, uint128 amountGwei) - // public - // filterFuzzedAddressInputs(withdrawer) - // returns (IEigenPodManager.BeaconChainQueuedWithdrawal memory, bytes32 /*withdrawalRoot*/) - // { - // // scale fuzzed amount up to be a whole amount of GWEI - // uint256 amount = uint256(amountGwei) * 1e9; - // address staker = address(this); - - // testRestakeBeaconChainETHSuccessfully(staker, amount); - - // (IEigenPodManager.BeaconChainQueuedWithdrawal memory queuedWithdrawal, bytes32 withdrawalRoot) = - // _createQueuedWithdrawal(staker, amount, withdrawer); - - // return (queuedWithdrawal, withdrawalRoot); - // } -// TODO: reimplement similar test - - // function testQueueWithdrawalBeaconChainETHFailsNonWholeAmountGwei(uint256 nonWholeAmount) external { - // // this also filters out the zero case, which will revert separately - // cheats.assume(nonWholeAmount % GWEI_TO_WEI != 0); - // cheats.expectRevert(bytes("EigenPodManager._queueWithdrawal: cannot queue a withdrawal of Beacon Chain ETH for an non-whole amount of gwei")); - // eigenPodManager.queueWithdrawal(nonWholeAmount, address(this)); - // } - - // function testQueueWithdrawalBeaconChainETHFailsZeroAmount() external { - // cheats.expectRevert(bytes("EigenPodManager._queueWithdrawal: amount must be greater than zero")); - // eigenPodManager.queueWithdrawal(0, address(this)); - // } - -// TODO: reimplement similar test - // function testCompleteQueuedWithdrawal() external { - // address staker = address(this); - // uint256 withdrawalAmount = 1e18; - - // // withdrawalAmount is converted to GWEI here - // (IEigenPodManager.BeaconChainQueuedWithdrawal memory queuedWithdrawal, bytes32 withdrawalRoot) = - // testQueueWithdrawalBeaconChainETHToSelf(uint128(withdrawalAmount / 1e9)); - - // IEigenPod eigenPod = eigenPodManager.getPod(staker); - // uint256 eigenPodBalanceBefore = address(eigenPod).balance; - - // uint256 middlewareTimesIndex = 0; - - // // actually complete the withdrawal - // cheats.startPrank(staker); - // cheats.expectEmit(true, true, true, true, address(eigenPodManager)); - // emit BeaconChainETHWithdrawalCompleted( - // queuedWithdrawal.podOwner, - // queuedWithdrawal.shares, - // queuedWithdrawal.nonce, - // queuedWithdrawal.delegatedAddress, - // queuedWithdrawal.withdrawer, - // withdrawalRoot - // ); - // eigenPodManager.completeQueuedWithdrawal(queuedWithdrawal, middlewareTimesIndex); - // cheats.stopPrank(); - - // // TODO: make EigenPodMock do something so we can verify that it gets called appropriately? - // uint256 eigenPodBalanceAfter = address(eigenPod).balance; - - // // verify that the withdrawal root does bit exist after queuing - // require(!eigenPodManager.withdrawalRootPending(withdrawalRoot), "withdrawalRootPendingBefore is true!"); - // } - -// TODO: reimplement similar test - // // creates a queued withdrawal of "beacon chain ETH shares", from `staker`, of `amountWei`, "to" the `withdrawer` - // function _createQueuedWithdrawal(address staker, uint256 amountWei, address withdrawer) - // internal - // returns (IEigenPodManager.BeaconChainQueuedWithdrawal memory queuedWithdrawal, bytes32 withdrawalRoot) - // { - // // create the struct, for reference / to return - // queuedWithdrawal = IEigenPodManager.BeaconChainQueuedWithdrawal({ - // shares: amountWei, - // podOwner: staker, - // nonce: eigenPodManager.cumulativeWithdrawalsQueued(staker), - // startBlock: uint32(block.number), - // delegatedTo: delegationManagerMock.delegatedTo(staker), - // withdrawer: withdrawer - // }); - - // // verify that the withdrawal root does not exist before queuing - // require(!eigenPodManager.withdrawalRootPending(withdrawalRoot), "withdrawalRootPendingBefore is true!"); - - // // get staker nonce and shares before queuing - // uint256 nonceBefore = eigenPodManager.cumulativeWithdrawalsQueued(staker); - // int256 sharesBefore = eigenPodManager.podOwnerShares(staker); - - // // actually create the queued withdrawal, and check for event emission - // cheats.startPrank(staker); - - // cheats.expectEmit(true, true, true, true, address(eigenPodManager)); - // emit BeaconChainETHWithdrawalQueued( - // queuedWithdrawal.podOwner, - // queuedWithdrawal.shares, - // queuedWithdrawal.nonce, - // queuedWithdrawal.delegatedAddress, - // queuedWithdrawal.withdrawer, - // eigenPodManager.calculateWithdrawalRoot(queuedWithdrawal) - // ); - // withdrawalRoot = eigenPodManager.queueWithdrawal(amountWei, withdrawer); - // cheats.stopPrank(); - - // // verify that the withdrawal root does exist after queuing - // require(eigenPodManager.withdrawalRootPending(withdrawalRoot), "withdrawalRootPendingBefore is false!"); - - // // verify that staker nonce incremented correctly and shares decremented correctly - // uint256 nonceAfter = eigenPodManager.cumulativeWithdrawalsQueued(staker); - // int256 sharesAfter = eigenPodManager.podOwnerShares(staker); - // require(nonceAfter == nonceBefore + 1, "nonce did not increment correctly on queuing withdrawal"); - // require(sharesAfter + amountWei == sharesBefore, "shares did not decrement correctly on queuing withdrawal"); - - // return (queuedWithdrawal, withdrawalRoot); - // } - - //Integration Test - // function testFullWithdrawalProofWithWrongWithdrawalFields(bytes32[] memory wrongWithdrawalFields) public { - // Relayer relay = new Relayer(); - // uint256 WITHDRAWAL_FIELD_TREE_HEIGHT = 2; - - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // BeaconChainProofs.WithdrawalProof memory proofs = _getWithdrawalProof(); - // bytes32 beaconStateRoot = getBeaconStateRoot(); - // cheats.assume(wrongWithdrawalFields.length != 2 ** WITHDRAWAL_FIELD_TREE_HEIGHT); - // validatorFields = getValidatorFields(); - - // cheats.expectRevert(bytes("BeaconChainProofs.verifyWithdrawal: withdrawalFields has incorrect length")); - // relay.verifyWithdrawal(beaconStateRoot, wrongWithdrawalFields, proofs); - // } - - // // Integration Test - // function testMismatchedWithdrawalProofInputs(uint64 numValidators, uint64 numValidatorProofs) external { - // cheats.assume(numValidators < numValidatorProofs && numValidatorProofs < 5); - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // bytes[] memory validatorFieldsProofArray = new bytes[](numValidatorProofs); - // for (uint256 index = 0; index < numValidators; index++) { - // validatorFieldsProofArray[index] = abi.encodePacked(getValidatorProof()); - // } - // bytes32[][] memory validatorFieldsArray = new bytes32[][](numValidators); - // for (uint256 index = 0; index < validatorFieldsArray.length; index++) { - // validatorFieldsArray[index] = getValidatorFields(); - // } - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray = new BeaconChainProofs.WithdrawalProof[](1); - - // withdrawalProofsArray[0] = _getWithdrawalProof(); - - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - // withdrawalFieldsArray[0] = withdrawalFields; - - // cheats.expectRevert(bytes("EigenPod.verifyAndProcessWithdrawals: inputs must be same length")); - // pod.verifyAndProcessWithdrawals(0, stateRootProofStruct, withdrawalProofsArray, validatorFieldsProofArray, validatorFieldsArray, withdrawalFieldsArray); - // } +} \ No newline at end of file diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 91635312b..2e937e488 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; import "../../contracts/pods/EigenPod.sol"; import "forge-std/Test.sol"; -contract EPInternalFunctions is EigenPod, Test { +contract EigenPodHarness is EigenPod, Test { constructor( IETHPOSDeposit _ethPOS, diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index a6c3dbbb3..3aa158e95 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -777,24 +777,31 @@ abstract contract IntegrationBase is IntegrationDeployer { IStrategy strat = strategies[i]; if (strat == BEACONCHAIN_ETH_STRAT) { - // TODO - could choose and set a "next updatable validator" at random here - uint40 validator = staker.getUpdatableValidator(); - uint64 beaconBalanceGwei = beaconChain.balanceOfGwei(validator); - - // For native eth, add or remove a random amount of Gwei - minimum 1 - // and max of the current beacon chain balance - int64 deltaGwei = int64(int(_randUint({ min: 1, max: beaconBalanceGwei }))); - bool addTokens = _randBool(); - deltaGwei = addTokens ? deltaGwei : -deltaGwei; - + // For native ETH, we're either going to slash the staker's validators, + // or award them consensus rewards. In either case, the magnitude of + // the balance update depends on the staker's active validator count + uint activeValidatorCount = staker.pod().activeValidatorCount(); + int64 deltaGwei; + if (_randBool()) { + uint40[] memory validators = staker.getActiveValidators(); + emit log_named_uint("slashing validators", validators.length); + + deltaGwei = -int64(beaconChain.slashValidators(validators)); + beaconChain.advanceEpoch_NoRewards(); + + emit log_named_int("slashed amount", deltaGwei); + } else { + emit log("generating consensus rewards for validators"); + + deltaGwei = int64(uint64(activeValidatorCount) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI()); + beaconChain.advanceEpoch_NoWithdraw(); + } + tokenDeltas[i] = int(deltaGwei) * int(GWEI_TO_WEI); - // stakerShareDeltas[i] = _calculateSharesDelta(newPodBalanceGwei, oldPodBalanceGwei); - stakerShareDeltas[i] = _calcNativeETHStakerShareDelta(staker, validator, beaconBalanceGwei, deltaGwei); + stakerShareDeltas[i] = tokenDeltas[i]; operatorShareDeltas[i] = _calcNativeETHOperatorShareDelta(staker, stakerShareDeltas[i]); - emit log_named_uint("current beacon balance (gwei): ", beaconBalanceGwei); - // emit log_named_uint("current validator pod balance (gwei): ", oldPodBalanceGwei); emit log_named_int("beacon balance delta (gwei): ", deltaGwei); emit log_named_int("staker share delta (gwei): ", stakerShareDeltas[i] / int(GWEI_TO_WEI)); emit log_named_int("operator share delta (gwei): ", operatorShareDeltas[i] / int(GWEI_TO_WEI)); @@ -812,38 +819,6 @@ abstract contract IntegrationBase is IntegrationDeployer { return (tokenDeltas, stakerShareDeltas, operatorShareDeltas); } - function _calcNativeETHStakerShareDelta( - User staker, - uint40 validatorIndex, - uint64 beaconBalanceGwei, - int64 deltaGwei - ) internal view returns (int) { - uint64 oldPodBalanceGwei = - staker - .pod() - .validatorPubkeyHashToInfo(beaconChain.pubkeyHash(validatorIndex)) - .restakedBalanceGwei; - - uint64 newPodBalanceGwei = _calcPodBalance(beaconBalanceGwei, deltaGwei); - - return (int(uint(newPodBalanceGwei)) - int(uint(oldPodBalanceGwei))) * int(GWEI_TO_WEI); - } - - function _calcPodBalance(uint64 beaconBalanceGwei, int64 deltaGwei) internal pure returns (uint64) { - uint64 podBalanceGwei; - if (deltaGwei < 0) { - podBalanceGwei = beaconBalanceGwei - uint64(uint(int(-deltaGwei))); - } else { - podBalanceGwei = beaconBalanceGwei + uint64(uint(int(deltaGwei))); - } - - if (podBalanceGwei > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) { - podBalanceGwei = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - } - - return podBalanceGwei; - } - function _calcNativeETHOperatorShareDelta(User staker, int shareDelta) internal view returns (int) { int curPodOwnerShares = eigenPodManager.podOwnerShares(address(staker)); int newPodOwnerShares = curPodOwnerShares + shareDelta; diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 2bec206c1..b209f6cf3 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -39,6 +39,7 @@ contract BeaconChainMock is PrintUtils { struct Validator { bool isDummy; + bool isSlashed; bytes32 pubkeyHash; bytes withdrawalCreds; uint64 effectiveBalanceGwei; @@ -51,7 +52,8 @@ contract BeaconChainMock is PrintUtils { uint constant ZERO_NODES_LENGTH = 100; // Rewards given to each validator during epoch processing - uint64 constant CONSENSUS_REWARD_AMOUNT_GWEI = 1; + uint64 public constant CONSENSUS_REWARD_AMOUNT_GWEI = 1; + uint64 public constant SLASH_AMOUNT_GWEI = 10; /// PROOF CONSTANTS (PROOF LENGTHS, FIELD SIZES): @@ -203,6 +205,36 @@ contract BeaconChainMock is PrintUtils { return exitedBalanceGwei; } + function slashValidators(uint40[] memory _validators) public returns (uint64 slashedBalanceGwei) { + _logM("slashValidators"); + + for (uint i = 0; i < _validators.length; i++) { + uint40 validatorIndex = _validators[i]; + Validator storage v = validators[validatorIndex]; + require(!v.isDummy, "BeaconChainMock: attempting to exit dummy validator. We need those for proofgen >:("); + require(!v.isSlashed, "BeaconChainMock: validator already slashed"); + + // Mark slashed and initiate validator exit + v.isSlashed = true; + v.exitEpoch = currentEpoch() + 1; + + // Calculate slash amount + uint64 curBalanceGwei = _currentBalanceGwei(validatorIndex); + if (SLASH_AMOUNT_GWEI > curBalanceGwei) { + slashedBalanceGwei += curBalanceGwei; + curBalanceGwei = 0; + } else { + slashedBalanceGwei += SLASH_AMOUNT_GWEI; + curBalanceGwei -= SLASH_AMOUNT_GWEI; + } + + // Decrease current balance (effective balance updated during epoch processing) + _setCurrentBalance(validatorIndex, curBalanceGwei); + } + + return slashedBalanceGwei; + } + /// @dev Move forward one epoch on the beacon chain, taking care of important epoch processing: /// - Award ALL validators CONSENSUS_REWARD_AMOUNT /// - Withdraw any balance over 32 ETH @@ -224,8 +256,6 @@ contract BeaconChainMock is PrintUtils { _advanceEpoch(); } - - /// @dev Like `advanceEpoch`, but does NOT generate consensus rewards for validators. /// This amount is added to each validator's current balance before effective balances /// are updated. @@ -409,6 +439,7 @@ contract BeaconChainMock is PrintUtils { validators.push(Validator({ isDummy: true, + isSlashed: false, pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), withdrawalCreds: "", effectiveBalanceGwei: dummyBalanceGwei, @@ -421,6 +452,7 @@ contract BeaconChainMock is PrintUtils { validators.push(Validator({ isDummy: false, + isSlashed: false, pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), withdrawalCreds: withdrawalCreds, effectiveBalanceGwei: balanceGwei, @@ -730,6 +762,15 @@ contract BeaconChainMock is PrintUtils { return validators[validatorIndex].exitEpoch; } + function totalEffectiveBalanceWei(uint40[] memory validatorIndices) public view returns (uint) { + uint total; + for (uint i = 0; i < validatorIndices.length; i++) { + total += uint(validators[validatorIndices[i]].effectiveBalanceGwei * GWEI_TO_WEI); + } + + return total; + } + /// @dev Returns the validator's effective balance, in gwei function effectiveBalance(uint40 validatorIndex) public view returns (uint64) { return validators[validatorIndex].effectiveBalanceGwei; @@ -758,7 +799,7 @@ contract BeaconChainMock is PrintUtils { vFields[BeaconChainProofs.VALIDATOR_PUBKEY_INDEX] = v.pubkeyHash; vFields[BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = bytes32(v.withdrawalCreds); vFields[BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = _toLittleEndianUint64(v.effectiveBalanceGwei); - vFields[BeaconChainProofs.VALIDATOR_EXIT_EPOCH_INDEX] = _toLittleEndianUint64(BeaconChainProofs.FAR_FUTURE_EPOCH); + vFields[BeaconChainProofs.VALIDATOR_EXIT_EPOCH_INDEX] = _toLittleEndianUint64(v.exitEpoch); return vFields; } @@ -918,4 +959,8 @@ contract BeaconChainMock is PrintUtils { return pubkeyHashes; } + + function isActive(uint40 validatorIndex) public view returns (bool) { + return validators[validatorIndex].exitEpoch == BeaconChainProofs.FAR_FUTURE_EPOCH; + } } diff --git a/src/test/integration/tests/Test.t.sol b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol similarity index 61% rename from src/test/integration/tests/Test.t.sol rename to src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol index 6199872fd..d5293d7f1 100644 --- a/src/test/integration/tests/Test.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -4,20 +4,19 @@ pragma solidity ^0.8.12; import "src/test/integration/IntegrationChecks.t.sol"; import "src/test/integration/users/User.t.sol"; -contract Integration_Tester is IntegrationCheckUtils { +contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { - using Strings for *; - using StdStyle for *; - - string constant SECTION_DELIMITER = "======"; - - function test_GasMetering() public { + modifier r(uint24 _rand) { _configRand({ - _randomSeed: 24, + _randomSeed: _rand, _assetTypes: HOLDS_ETH, _userTypes: DEFAULT }); + _; + } + + function test_GasMetering() public r(24) { (User staker, ,) = _newRandomStaker(); cheats.pauseGasMetering(); @@ -72,13 +71,96 @@ contract Integration_Tester is IntegrationCheckUtils { VERIFY -> START/COMPLETE CHECKPOINT *******************************************************************************/ - function test_VerifyAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); + /// 1. Verify one or more validators' withdrawal credentials + /// 2. start a checkpoint + /// 3. complete a checkpoint + /// => no change in shares + function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + uint40[] memory subset = _choose(validators); + uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + + staker.verifyWithdrawalCredentials(subset); + check_VerifyWC_State(staker, subset, subsetBalanceWei); + // Advance epoch without generating consensus rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + /// 1. Verify one or more validators' withdrawal credentials + /// 2. start a checkpoint (in the same block) + /// 3. complete a checkpoint + /// => no change in shares + function test_VerifyWC_SameBlock_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + uint40[] memory subset = _choose(validators); + uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + + staker.verifyWithdrawalCredentials(subset); + check_VerifyWC_State(staker, subset, subsetBalanceWei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + /// 1. Verify one or more validators' withdrawal credentials + /// -- fully exit one or more validators to the pod + /// 2. start a checkpoint + /// 3. complete a checkpoint + /// => no change in shares + function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + uint40[] memory subset = _choose(validators); + uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + + staker.verifyWithdrawalCredentials(subset); + check_VerifyWC_State(staker, subset, subsetBalanceWei); + + // Fully exit validators to pod and advance epoch without generating consensus rewards + staker.exitValidators(subset); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + /// 1. Verify one or more validators' withdrawal credentials + /// -- earn rewards on beacon chain (not withdrawn to pod) + /// 2. start a checkpoint + /// 3. complete a checkpoint + /// => shares increase by rewards earned + function test_VerifyWC_Earn_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + + } + + /// 1. Verify one or more validators' withdrawal credentials + /// -- earn rewards on beacon chain (not withdrawn to pod) + /// 2. start a checkpoint + /// 3. complete a checkpoint + /// => shares increase by rewards earned + function test_VerifyWC_Earn_Withdraw_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + + } + + function test_VerifyAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -96,13 +178,7 @@ contract Integration_Tester is IntegrationCheckUtils { check_CompleteCheckpoint_State(staker); } - function test_VerifyAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - + function test_VerifyAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -120,13 +196,7 @@ contract Integration_Tester is IntegrationCheckUtils { check_CompleteCheckpoint_State(staker); } - function test_VerifyAll_Start_CompleteCP_NoRewards(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - + function test_VerifyAll_Start_CompleteCP_NoRewards(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -148,13 +218,7 @@ contract Integration_Tester is IntegrationCheckUtils { VERIFY -> EXIT -> START/COMPLETE CHECKPOINT *******************************************************************************/ - function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - + function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -173,13 +237,7 @@ contract Integration_Tester is IntegrationCheckUtils { check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); } - function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - + function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -198,13 +256,7 @@ contract Integration_Tester is IntegrationCheckUtils { check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); } - function test_VerifyAll_ExitAll_Start_CompleteCP_NoRewards(uint24 _rand) public { - _configRand({ - _randomSeed: _rand, - _assetTypes: HOLDS_ETH, - _userTypes: DEFAULT - }); - + function test_VerifyAll_ExitAll_Start_CompleteCP_NoRewards(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); @@ -223,54 +275,9 @@ contract Integration_Tester is IntegrationCheckUtils { check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); } - function _logPod(User staker) internal { - EigenPod pod = staker.pod(); - - _logSection(string.concat(staker.NAME().cyan(), ": Pod Details")); - - _log("- hasRestaked", pod.hasRestaked()); - _log("- podOwnerShares", eigenPodManager.podOwnerShares(address(staker))); - _log("- activeValidatorCount", pod.activeValidatorCount()); - _logU64("- withdrawableRestakedELGwei", pod.withdrawableRestakedExecutionLayerGwei()); - - bool hasCheckpoint = pod.currentCheckpointTimestamp() != 0; - _log("- has checkpoint", hasCheckpoint); - if (hasCheckpoint) { - IEigenPod.Checkpoint memory checkpoint = pod.currentCheckpoint(); - _log("-- beaconBlockRoot", checkpoint.beaconBlockRoot); - _log("-- podBalanceGwei", checkpoint.podBalanceGwei); - _log("-- balanceDeltasGwei", checkpoint.balanceDeltasGwei); - _log("-- proofsRemaining", checkpoint.proofsRemaining); - } - - _logSection(""); - } - - function _logSection(string memory name) internal { - emit log(string.concat( - SECTION_DELIMITER, - name, - SECTION_DELIMITER - )); - } - - function _log(string memory name, bool value) internal { - emit log_named_string(name, value ? "true".green() : "false".magenta()); - } - - function _log(string memory name, bytes32 value) internal { - emit log_named_string(name, value.dimBytes32()); - } - - function _log(string memory name, uint value) internal { - emit log_named_uint(name, value); - } - - function _logU64(string memory name, uint64 value) internal { - emit log_named_uint(name, value); - } - - function _log(string memory name, int value) internal { - emit log_named_int(name, value); + /// @dev Choose a random subset of validators + /// TODO implement + function _choose(uint40[] memory validators) internal returns (uint40[] memory) { + return validators; } } \ 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 2c3fceaa8..f7b5b8291 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -210,6 +210,136 @@ contract User is PrintUtils { function startValidators() public createSnapshot virtual returns (uint40[] memory, uint) { _logM("startValidators"); + return _startValidators(); + } + + function exitValidators(uint40[] memory _validators) public createSnapshot virtual returns (uint64 exitedBalanceGwei) { + _logM("exitValidators"); + + return _exitValidators(_validators); + } + + /******************************************************************************* + EIGENPOD METHODS + *******************************************************************************/ + + function verifyWithdrawalCredentials( + uint40[] memory _validators + ) public createSnapshot virtual { + _logM("verifyWithdrawalCredentials"); + + _verifyWithdrawalCredentials(_validators); + } + + function startCheckpoint() public createSnapshot virtual { + _logM("startCheckpoint"); + + _startCheckpoint(); + } + + function completeCheckpoint() public createSnapshot virtual { + _logM("completeCheckpoint"); + + _completeCheckpoint(); + } + + /******************************************************************************* + STRATEGY METHODS + *******************************************************************************/ + + /// @dev For each strategy/token balance, call the relevant deposit method + function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot virtual { + _logM("depositIntoEigenlayer"); + + for (uint i = 0; i < strategies.length; i++) { + IStrategy strat = strategies[i]; + uint tokenBalance = tokenBalances[i]; + + if (strat == BEACONCHAIN_ETH_STRAT) { + (uint40[] memory newValidators, ) = _startValidators(); + _verifyWithdrawalCredentials(newValidators); + } else { + IERC20 underlyingToken = strat.underlyingToken(); + underlyingToken.approve(address(strategyManager), tokenBalance); + strategyManager.depositIntoStrategy(strat, underlyingToken, tokenBalance); + } + } + } + + function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public createSnapshot virtual { + _logM("updateBalances"); + + for (uint i = 0; i < strategies.length; i++) { + IStrategy strat = strategies[i]; + int delta = tokenDeltas[i]; + + if (strat == BEACONCHAIN_ETH_STRAT) { + // If any balance update has occured, a checkpoint will pick it up + _startCheckpoint(); + if (pod.activeValidatorCount() != 0) { + _completeCheckpoint(); + } + } else { + uint tokens = uint(delta); + IERC20 underlyingToken = strat.underlyingToken(); + underlyingToken.approve(address(strategyManager), tokens); + strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); + } + } + } + + /******************************************************************************* + INTERNAL METHODS + *******************************************************************************/ + + function _completeQueuedWithdrawal( + IDelegationManager.Withdrawal memory withdrawal, + bool receiveAsTokens + ) internal virtual returns (IERC20[] memory) { + IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); + + for (uint i = 0; i < tokens.length; i++) { + IStrategy strat = withdrawal.strategies[i]; + uint shares = withdrawal.shares[i]; + + 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) { + + _log("- exiting all validators and completing checkpoint"); + uint64 exitedBalanceGwei = _exitValidators(getActiveValidators()); + + beaconChain.advanceEpoch_NoRewards(); + + _startCheckpoint(); + if (pod.activeValidatorCount() != 0) { + _completeCheckpoint(); + } + } + } else { + tokens[i] = strat.underlyingToken(); + } + } + + delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0, receiveAsTokens); + + return tokens; + } + + function _createPod() internal virtual { + pod = EigenPod(payable(eigenPodManager.createPod())); + } + + /// @dev Uses any ETH held by the User to start validators on the beacon chain + /// @return A list of created validator indices + /// @return The amount of wei sent to the beacon chain + /// Note: If the user does not have enough ETH to start a validator, this method reverts + /// Note: This method also advances one epoch forward on the beacon chain, so that + /// withdrawal credential proofs are generated for each validator. + function _startValidators() internal returns (uint40[] memory, uint) { uint balanceWei = address(this).balance; // Number of full validators: balance / 32 ETH @@ -260,9 +390,7 @@ contract User is PrintUtils { return (newValidators, totalBeaconBalance); } - function exitValidators(uint40[] memory _validators) public createSnapshot virtual returns (uint64 exitedBalanceGwei) { - _logM("exitValidators"); - + function _exitValidators(uint40[] memory _validators) internal returns (uint64 exitedBalanceGwei) { _log("- exiting num validators", _validators.length); for (uint i = 0; i < _validators.length; i++) { @@ -274,35 +402,11 @@ contract User is PrintUtils { return exitedBalanceGwei; } - /******************************************************************************* - EIGENPOD METHODS - *******************************************************************************/ - - function verifyWithdrawalCredentials( - uint40[] memory _validators - ) public createSnapshot virtual { - _logM("verifyWithdrawalCredentials"); - - CredentialProofs memory proofs = beaconChain.getCredentialProofs(_validators); - - pod.verifyWithdrawalCredentials({ - beaconTimestamp: proofs.beaconTimestamp, - stateRootProof: proofs.stateRootProof, - validatorIndices: _validators, - validatorFieldsProofs: proofs.validatorFieldsProofs, - validatorFields: proofs.validatorFields - }); - } - - function startCheckpoint() public createSnapshot virtual { - _logM("startCheckpoint"); - + function _startCheckpoint() internal { pod.startCheckpoint(false); } - function completeCheckpoint() public createSnapshot virtual { - _logM("completeCheckpoint"); - + function _completeCheckpoint() internal { _log("- active validator count", pod.activeValidatorCount()); _log("- proofs remaining", pod.currentCheckpoint().proofsRemaining); @@ -315,120 +419,16 @@ contract User is PrintUtils { }); } - /******************************************************************************* - STRATEGYMANAGER METHODS - *******************************************************************************/ - - function depositLSTs(IStrategy[] memory strategies) public createSnapshot virtual { - // _log("depositIntoStrategies"); - - // for (uint i = 0; i < strategies.length; i++) { - // IStrategy strat = strategies[i]; - // uint tokenBalance = tokenBalances[i]; - - // IERC20 underlyingToken = strat.underlyingToken(); - // underlyingToken.approve(address(strategyManager), tokenBalance); - // strategyManager.depositIntoStrategy(strat, underlyingToken, tokenBalance); - // } - } - - /// @dev For each strategy/token balance, call the relevant deposit method - function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot virtual { - _logM("depositIntoEigenlayer"); - - revert("unimplemented"); - } - - function updateBalances(IStrategy[] memory strategies, int[] memory tokenDeltas) public createSnapshot virtual { - _logM("updateBalances"); - revert("fail - placeholder"); - - // for (uint i = 0; i < strategies.length; i++) { - // IStrategy strat = strategies[i]; - // int delta = tokenDeltas[i]; - - // if (strat == BEACONCHAIN_ETH_STRAT) { - // // TODO - right now, we just grab the first validator - // uint40 validator = getUpdatableValidator(); - // BalanceUpdate memory update = beaconChain.updateBalance(validator, delta); - - // int sharesBefore = eigenPodManager.podOwnerShares(address(this)); - - // pod.verifyBalanceUpdates({ - // oracleTimestamp: update.oracleTimestamp, - // validatorIndices: update.validatorIndices, - // stateRootProof: update.stateRootProof, - // validatorFieldsProofs: update.validatorFieldsProofs, - // validatorFields: update.validatorFields - // }); - - // int sharesAfter = eigenPodManager.podOwnerShares(address(this)); - - // emit log_named_int("pod owner shares before: ", sharesBefore); - // emit log_named_int("pod owner shares after: ", sharesAfter); - // } else { - // uint tokens = uint(delta); - // IERC20 underlyingToken = strat.underlyingToken(); - // underlyingToken.approve(address(strategyManager), tokens); - // strategyManager.depositIntoStrategy(strat, underlyingToken, tokens); - // } - // } - } - - function _completeQueuedWithdrawal( - IDelegationManager.Withdrawal memory withdrawal, - bool receiveAsTokens - ) internal virtual returns (IERC20[] memory) { - IERC20[] memory tokens = new IERC20[](withdrawal.strategies.length); - - for (uint i = 0; i < tokens.length; i++) { - IStrategy strat = withdrawal.strategies[i]; - - if (strat == BEACONCHAIN_ETH_STRAT) { - tokens[i] = NATIVE_ETH; - - // If we're withdrawing as tokens, we need to process a withdrawal proof first - if (receiveAsTokens) { - - emit log("exiting validators and processing withdrawals..."); - revert("fail - placeholder"); - - // uint numValidators = validators.length; - // for (uint j = 0; j < numValidators; j++) { - // emit log_named_uint("exiting validator ", j); - - // uint40 validatorIndex = validators[j]; - // BeaconWithdrawal memory proofs = beaconChain.exitValidator(validatorIndex); - - // uint64 withdrawableBefore = pod.withdrawableRestakedExecutionLayerGwei(); - - // pod.verifyAndProcessWithdrawals({ - // oracleTimestamp: proofs.oracleTimestamp, - // stateRootProof: proofs.stateRootProof, - // withdrawalProofs: proofs.withdrawalProofs, - // validatorFieldsProofs: proofs.validatorFieldsProofs, - // validatorFields: proofs.validatorFields, - // withdrawalFields: proofs.withdrawalFields - // }); - - // uint64 withdrawableAfter = pod.withdrawableRestakedExecutionLayerGwei(); - - // emit log_named_uint("pod withdrawable before: ", withdrawableBefore); - // emit log_named_uint("pod withdrawable after: ", withdrawableAfter); - // } - } - } else { - tokens[i] = strat.underlyingToken(); - } - } - - delegationManager.completeQueuedWithdrawal(withdrawal, tokens, 0, receiveAsTokens); - - return tokens; - } + function _verifyWithdrawalCredentials(uint40[] memory _validators) internal { + CredentialProofs memory proofs = beaconChain.getCredentialProofs(_validators); - function _createPod() internal virtual { - pod = EigenPod(payable(eigenPodManager.createPod())); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: _validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); } function _podWithdrawalCredentials() internal view returns (bytes memory) { @@ -464,8 +464,23 @@ contract User is PrintUtils { return expectedWithdrawals; } - function getUpdatableValidator() public view returns (uint40) { - return validators[0]; + function getActiveValidators() public view returns (uint40[] memory) { + uint40[] memory activeValidators = new uint40[](validators.length); + + uint numActive; + uint pos; + for(uint i = 0; i < validators.length; i++) { + if (beaconChain.isActive(validators[i])) { + activeValidators[pos] = validators[i]; + numActive++; + pos++; + } + } + + // Manually update length + assembly { mstore(activeValidators, numActive) } + + return activeValidators; } } @@ -477,7 +492,7 @@ contract User_AltMethods is User { constructor(string memory name) User(name) {} function delegateTo(User operator) public createSnapshot override { - _logM("delegateTo", operator.NAME()); + _logM("delegateTo_ALT", operator.NAME()); // Create empty data ISignatureUtils.SignatureWithExpiry memory emptySig; @@ -500,69 +515,46 @@ contract User_AltMethods is User { } function depositIntoEigenlayer(IStrategy[] memory strategies, uint[] memory tokenBalances) public createSnapshot override { - // emit log(_name(".depositIntoEigenlayer")); + _logM("depositIntoEigenlayer_ALT"); - // uint256 expiry = type(uint256).max; - // for (uint i = 0; i < strategies.length; i++) { - // IStrategy strat = strategies[i]; - // uint tokenBalance = tokenBalances[i]; - - // if (strat == BEACONCHAIN_ETH_STRAT) { - // // We're depositing via `eigenPodManager.stake`, which only accepts - // // deposits of exactly 32 ether. - // require(tokenBalance % 32 ether == 0, "User.depositIntoEigenlayer: balance must be multiple of 32 eth"); - - // // For each multiple of 32 ether, deploy a new validator to the same pod - // uint numValidators = tokenBalance / 32 ether; - // for (uint j = 0; j < numValidators; j++) { - // eigenPodManager.stake{ value: 32 ether }("", "", bytes32(0)); - - // (uint40 newValidatorIndex, CredentialsProofs memory proofs) = - // beaconChain.newValidator({ - // balanceWei: 32 ether, - // withdrawalCreds: _podWithdrawalCredentials() - // }); - - // validators.push(newValidatorIndex); - - // pod.verifyWithdrawalCredentials({ - // beaconTimestamp: proofs.oracleTimestamp, - // stateRootProof: proofs.stateRootProof, - // validatorIndices: proofs.validatorIndices, - // validatorFieldsProofs: proofs.validatorFieldsProofs, - // validatorFields: proofs.validatorFields - // }); - // } - // } else { - // // Approve token - // IERC20 underlyingToken = strat.underlyingToken(); - // underlyingToken.approve(address(strategyManager), tokenBalance); - - // // Get signature - // uint256 nonceBefore = strategyManager.nonces(address(this)); - // bytes32 structHash = keccak256( - // abi.encode(strategyManager.DEPOSIT_TYPEHASH(), address(this), strat, underlyingToken, tokenBalance, nonceBefore, expiry) - // ); - // bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", strategyManager.domainSeparator(), structHash)); - // bytes memory signature = bytes(abi.encodePacked(digestHash)); // dummy sig data - - // // Mark hash as signed - // signedHashes[digestHash] = true; - - // // Deposit - // strategyManager.depositIntoStrategyWithSignature( - // strat, - // underlyingToken, - // tokenBalance, - // address(this), - // expiry, - // signature - // ); - - // // Mark hash as used - // signedHashes[digestHash] = false; - // } - // } + uint256 expiry = type(uint256).max; + for (uint i = 0; i < strategies.length; i++) { + IStrategy strat = strategies[i]; + uint tokenBalance = tokenBalances[i]; + + if (strat == BEACONCHAIN_ETH_STRAT) { + (uint40[] memory newValidators, ) = _startValidators(); + _verifyWithdrawalCredentials(newValidators); + } else { + // Approve token + IERC20 underlyingToken = strat.underlyingToken(); + underlyingToken.approve(address(strategyManager), tokenBalance); + + // Get signature + uint256 nonceBefore = strategyManager.nonces(address(this)); + bytes32 structHash = keccak256( + abi.encode(strategyManager.DEPOSIT_TYPEHASH(), address(this), strat, underlyingToken, tokenBalance, nonceBefore, expiry) + ); + bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", strategyManager.domainSeparator(), structHash)); + bytes memory signature = bytes(abi.encodePacked(digestHash)); // dummy sig data + + // Mark hash as signed + signedHashes[digestHash] = true; + + // Deposit + strategyManager.depositIntoStrategyWithSignature( + strat, + underlyingToken, + tokenBalance, + address(this), + expiry, + signature + ); + + // Mark hash as used + signedHashes[digestHash] = false; + } + } } bytes4 internal constant MAGIC_VALUE = 0x1626ba7e; diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol index 43833bab6..931173364 100644 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ b/src/test/unit/EigenPod-PodManagerUnit.t.sol @@ -83,7 +83,6 @@ contract EigenPod_PodManager_UnitTests is EigenLayerUnitTestSetup { address(eigenPodManagerWrapper), abi.encodeWithSelector( EigenPodManager.initialize.selector, - beaconChainOracle, initialOwner, pauserRegistry, 0 /*initialPausedStatus*/ @@ -513,7 +512,7 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un // Helper Functions function _getStateRootProof() internal returns (BeaconChainProofs.StateRootProof memory) { - return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), abi.encodePacked(getStateRootProof())); + return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), getStateRootProof()); } function _setOracleBlockRoot() internal { @@ -558,7 +557,7 @@ contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_Un validatorFields.push(getValidatorFields()); // Set validator fields proof - validatorFieldsProofs.push(abi.encodePacked(getWithdrawalCredentialProof())); // Validator fields are proven here + validatorFieldsProofs.push(getWithdrawalCredentialProof()); // Validator fields are proven here } // function _setBalanceUpdateParams() internal { diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 018e8ab7e..62cfadb19 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -363,14 +363,14 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven contract EigenPodHarnessSetup is EigenPodUnitTests { // Harness that exposes internal functions for test - EPInternalFunctions public eigenPodHarnessImplementation; - EPInternalFunctions public eigenPodHarness; + EigenPodHarness public eigenPodHarnessImplementation; + EigenPodHarness public eigenPodHarness; function setUp() public virtual override { EigenPodUnitTests.setUp(); // Deploy EP Harness - eigenPodHarnessImplementation = new EPInternalFunctions( + eigenPodHarnessImplementation = new EigenPodHarness( ethPOSDepositMock, eigenPodManagerMock, GOERLI_GENESIS_TIME @@ -378,7 +378,7 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { // Upgrade eigenPod to harness UpgradeableBeacon(address(eigenPodBeacon)).upgradeTo(address(eigenPodHarnessImplementation)); - eigenPodHarness = EPInternalFunctions(payable(eigenPod)); + eigenPodHarness = EigenPodHarness(payable(eigenPod)); } } @@ -511,7 +511,7 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe // Set beacon state root, validatorIndex beaconStateRoot = getBeaconStateRoot(); validatorIndex = uint40(getValidatorIndex()); - validatorFieldsProof = abi.encodePacked(getWithdrawalCredentialProof()); // Validator fields are proven here + validatorFieldsProof = getWithdrawalCredentialProof(); // Validator fields are proven here validatorFields = getValidatorFields(); // Get an oracle timestamp @@ -1067,7 +1067,7 @@ contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing // Set beacon state root, validatorIndex beaconStateRoot = getBeaconStateRoot(); uint40 validatorIndex = uint40(getValidatorIndex()); - validatorFieldsProof = abi.encodePacked(getWithdrawalCredentialProof()); // Validator fields are proven here + validatorFieldsProof = getWithdrawalCredentialProof(); // Validator fields are proven here validatorFields = getValidatorFields(); // Get an oracle timestamp diff --git a/src/test/utils/ProofParsing.sol b/src/test/utils/ProofParsing.sol index fd69678ec..e3607e07b 100644 --- a/src/test/utils/ProofParsing.sol +++ b/src/test/utils/ProofParsing.sol @@ -115,13 +115,13 @@ contract ProofParsing is Test { return slotProof; } - function getStateRootProof() public returns(bytes32[] memory) { + function getStateRootProof() public returns(bytes memory) { bytes32[] memory stateRootProof = new bytes32[](3); for (uint i = 0; i < 3; i++) { prefix = string.concat(".StateRootAgainstLatestBlockHeaderProof[", string.concat(vm.toString(i), "]")); stateRootProof[i] = (stdJson.readBytes32(proofConfigJson, prefix)); } - return stateRootProof; + return abi.encodePacked(stateRootProof); } function getWithdrawalProofDeneb() public returns(bytes32[10] memory) { @@ -174,18 +174,18 @@ contract ProofParsing is Test { return validatorFields; } - function getBalanceUpdateProof() public returns(bytes32[] memory) { + function getBalanceUpdateProof() public returns(bytes memory) { // Balance update proofs are the same as withdrawal credential proofs return getWithdrawalCredentialProof(); } - function getWithdrawalCredentialProof() public returns(bytes32[] memory) { + function getWithdrawalCredentialProof() public returns(bytes memory) { bytes32[] memory withdrawalCredentialProof = new bytes32[](46); for (uint i = 0; i < 46; i++) { prefix = string.concat(".WithdrawalCredentialProof[", string.concat(vm.toString(i), "]")); withdrawalCredentialProof[i] = (stdJson.readBytes32(proofConfigJson, prefix)); } - return withdrawalCredentialProof; + return abi.encodePacked(withdrawalCredentialProof); } function getValidatorFieldsProof() public returns(bytes32[] memory) { From 8a69af47575fb30190748e7750384372287f65ca Mon Sep 17 00:00:00 2001 From: wadealexc Date: Thu, 6 Jun 2024 16:34:32 +0000 Subject: [PATCH 21/85] fix: fixes two issues with verifyWC timing * verifyWC -> startCheckpoint in the same block no longer results in a bricked checkpoint * verifyWC using a timestamp older than the current checkpoint no longer allows you to submit a checkpoint proof for the new validator * chore: fix outdated comment --- src/contracts/interfaces/IEigenPod.sol | 2 +- src/contracts/pods/EigenPod.sol | 56 +++++++++++++++----------- src/test/EigenPod.t.sol | 2 +- src/test/unit/EigenPodUnit.t.sol | 10 ++--- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 675c53a98..8ef62e8ed 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -38,7 +38,7 @@ interface IEigenPod { // amount of beacon chain ETH restaked on EigenLayer in gwei uint64 restakedBalanceGwei; //timestamp of the validator's most recent balance update - uint64 mostRecentBalanceUpdateTimestamp; + uint64 lastCheckpointedAt; // status of the validator VALIDATOR_STATUS status; } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 4616c4979..863744bf2 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -174,9 +174,9 @@ contract EigenPod is external onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) { - uint64 beaconTimestamp = currentCheckpointTimestamp; + uint64 checkpointTimestamp = currentCheckpointTimestamp; require( - beaconTimestamp != 0, + checkpointTimestamp != 0, "EigenPod.verifyCheckpointProofs: must have active checkpoint to perform checkpoint proof" ); @@ -199,12 +199,12 @@ contract EigenPod is if (validatorInfo.status != VALIDATOR_STATUS.ACTIVE) { continue; } - + // Ensure we aren't proving a validator twice for the same checkpoint. This will fail if: // - validator submitted twice during this checkpoint // - validator withdrawal credentials verified after checkpoint starts, then submitted // as a checkpoint proof - if (validatorInfo.mostRecentBalanceUpdateTimestamp >= beaconTimestamp) { + if (validatorInfo.lastCheckpointedAt >= checkpointTimestamp) { continue; } @@ -217,7 +217,7 @@ contract EigenPod is // the pod when `startCheckpoint` was originally called. (int128 balanceDeltaGwei, uint64 exitedBalanceGwei) = _verifyCheckpointProof({ validatorInfo: validatorInfo, - beaconTimestamp: beaconTimestamp, + checkpointTimestamp: checkpointTimestamp, balanceContainerRoot: balanceContainerProof.balanceContainerRoot, proof: proofs[i] }); @@ -228,7 +228,7 @@ contract EigenPod is } // Update the checkpoint and the total amount attributed to exited validators - checkpointBalanceExitedGwei[beaconTimestamp] += exitedBalancesGwei; + checkpointBalanceExitedGwei[checkpointTimestamp] += exitedBalancesGwei; _updateCheckpoint(checkpoint); } @@ -321,7 +321,7 @@ contract EigenPod is // Validator must be eligible for a staleness proof require( - beaconTimestamp > validatorInfo.mostRecentBalanceUpdateTimestamp + TIME_TILL_STALE_BALANCE, + beaconTimestamp > validatorInfo.lastCheckpointedAt + TIME_TILL_STALE_BALANCE, "EigenPod.verifyStaleBalance: validator balance is not stale yet" ); @@ -417,8 +417,8 @@ contract EigenPod is bytes calldata validatorFieldsProof, bytes32[] calldata validatorFields ) internal returns (uint256) { - bytes32 validatorPubkeyHash = validatorFields.getPubkeyHash(); - ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkeyHash]; + bytes32 pubkeyHash = validatorFields.getPubkeyHash(); + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[pubkeyHash]; // Withdrawal credential proofs should only be processed for "INACTIVE" validators require( @@ -439,7 +439,7 @@ contract EigenPod is ); // Get the validator's effective balance. Note that this method uses effective balance, while - // `verifyBalanceUpdates` uses current balance. Effective balance is updated per-epoch - so it's + // `verifyCheckpointProofs` uses current balance. Effective balance is updated per-epoch - so it's // less accurate, but is good enough for verifying withdrawal credentials. uint64 restakedBalanceGwei = validatorFields.getEffectiveBalanceGwei(); @@ -451,24 +451,28 @@ contract EigenPod is validatorIndex: validatorIndex }); - // Proofs complete - update this validator's status, record its proven balance, and save in state: + // Account for validator in future checkpoints activeValidatorCount++; - validatorInfo.status = VALIDATOR_STATUS.ACTIVE; - validatorInfo.validatorIndex = validatorIndex; - validatorInfo.mostRecentBalanceUpdateTimestamp = beaconTimestamp; - validatorInfo.restakedBalanceGwei = restakedBalanceGwei; + uint64 lastCheckpointedAt = + currentCheckpointTimestamp == 0 ? lastCheckpointTimestamp : currentCheckpointTimestamp; - _validatorPubkeyHashToInfo[validatorPubkeyHash] = validatorInfo; + // Proofs complete - create the validator in state + _validatorPubkeyHashToInfo[pubkeyHash] = ValidatorInfo({ + validatorIndex: validatorIndex, + restakedBalanceGwei: restakedBalanceGwei, + lastCheckpointedAt: lastCheckpointedAt, + status: VALIDATOR_STATUS.ACTIVE + }); emit ValidatorRestaked(validatorIndex); - emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, restakedBalanceGwei); + emit ValidatorBalanceUpdated(validatorIndex, lastCheckpointedAt, restakedBalanceGwei); return restakedBalanceGwei * GWEI_TO_WEI; } function _verifyCheckpointProof( ValidatorInfo memory validatorInfo, - uint64 beaconTimestamp, + uint64 checkpointTimestamp, bytes32 balanceContainerRoot, BeaconChainProofs.BalanceProof calldata proof ) internal returns (int128 balanceDeltaGwei, uint64 exitedBalanceGwei) { @@ -489,12 +493,13 @@ contract EigenPod is previousAmountGwei: prevBalanceGwei }); - emit ValidatorBalanceUpdated(validatorIndex, beaconTimestamp, newBalanceGwei); + emit ValidatorBalanceUpdated(validatorIndex, checkpointTimestamp, newBalanceGwei); } - // Update validator state. If their new balance is 0, they are marked `WITHDRAWN` validatorInfo.restakedBalanceGwei = newBalanceGwei; - validatorInfo.mostRecentBalanceUpdateTimestamp = beaconTimestamp; + validatorInfo.lastCheckpointedAt = checkpointTimestamp; + + // If the validator's new balance is 0, mark them withdrawn if (newBalanceGwei == 0) { activeValidatorCount--; validatorInfo.status = VALIDATOR_STATUS.WITHDRAWN; @@ -502,11 +507,11 @@ contract EigenPod is // so this should be a safe conversion exitedBalanceGwei = uint64(uint128(-balanceDeltaGwei)); - emit ValidatorWithdrawn(beaconTimestamp, validatorIndex); + emit ValidatorWithdrawn(checkpointTimestamp, validatorIndex); } _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; - emit ValidatorCheckpointed(beaconTimestamp, validatorIndex); + emit ValidatorCheckpointed(checkpointTimestamp, validatorIndex); return (balanceDeltaGwei, exitedBalanceGwei); } @@ -530,6 +535,11 @@ contract EigenPod is "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" ); + require( + lastCheckpointTimestamp != uint64(block.timestamp), + "EigenPod._startCheckpoint: cannot checkpoint twice in one block" + ); + // Snapshot pod balance at the start of the checkpoint, subtracting pod balance that has // previously been credited with shares. Once the checkpoint is finalized, `podBalanceGwei` // will be added to the total validator balance delta and credited as shares. diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index a5ab9e3b6..cd57c557b 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -752,7 +752,7 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { require(info1.validatorIndex == info2.validatorIndex, "validatorIndex does not match"); require(info1.restakedBalanceGwei > 0, "restakedBalanceGwei is 0"); require(info1.restakedBalanceGwei == info2.restakedBalanceGwei, "restakedBalanceGwei does not match"); - require(info1.mostRecentBalanceUpdateTimestamp == info2.mostRecentBalanceUpdateTimestamp, "mostRecentBalanceUpdateTimestamp does not match"); + require(info1.lastCheckpointedAt == info2.lastCheckpointedAt, "lastCheckpointedAt does not match"); require(info1.status == info2.status, "status does not match"); } diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 62cfadb19..aa041cf06 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -502,7 +502,7 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.ACTIVE), "Validator status should be active"); assertEq(validatorInfo.validatorIndex, validatorIndex, "Validator index incorrectly set"); - assertEq(validatorInfo.mostRecentBalanceUpdateTimestamp, oracleTimestamp, "Most recent balance update timestamp incorrectly set"); + assertEq(validatorInfo.lastCheckpointedAt, oracleTimestamp, "Last checkpointed at timestamp incorrectly set"); assertEq(validatorInfo.restakedBalanceGwei, restakedBalanceGwei, "Restaked balance gwei not set correctly"); } @@ -531,9 +531,9 @@ contract EigenPodUnitTests_VerifyBalanceUpdateTests is EigenPodHarnessSetup, Pro bytes validatorFieldsProof; bytes32[] validatorFields; - // function testFuzz_revert_oracleTimestampStale(uint64 oracleFuzzTimestamp, uint64 mostRecentBalanceUpdateTimestamp) public { + // function testFuzz_revert_oracleTimestampStale(uint64 oracleFuzzTimestamp, uint64 lastCheckpointedAt) public { // // Constain inputs and set proof file - // cheats.assume(oracleFuzzTimestamp < mostRecentBalanceUpdateTimestamp); + // cheats.assume(oracleFuzzTimestamp < lastCheckpointedAt); // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); // // Get validator fields and balance update root @@ -550,7 +550,7 @@ contract EigenPodUnitTests_VerifyBalanceUpdateTests is EigenPodHarnessSetup, Pro // bytes32(0), // validatorFieldsProof, // validatorFields, - // mostRecentBalanceUpdateTimestamp + // lastCheckpointedAt // ); // } @@ -961,7 +961,7 @@ contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing // IEigenPod.ValidatorInfo memory validatorInfo = IEigenPod.ValidatorInfo({ // validatorIndex: 0, // restakedBalanceGwei: restakedAmount, - // mostRecentBalanceUpdateTimestamp: 0, + // lastCheckpointedAt: 0, // status: IEigenPod.VALIDATOR_STATUS.ACTIVE // }); From d2d4ea8c81ce39c459d43895e10c07cc5d5849ed Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 7 Jun 2024 15:57:40 +0000 Subject: [PATCH 22/85] test: fleshed out eigenpod test flows * also reduced number of validators being generated by tests (for speed) * test: flesh out additional pod flows * chore: make bindings * test: add checks for several integration tests --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/BeaconChainProofs/binding.go | 2 +- .../DelayedWithdrawalRouter/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 164 +++----- pkg/bindings/EigenPodManager/binding.go | 334 +-------------- .../EigenPodManagerStorage/binding.go | 332 +-------------- pkg/bindings/EigenPodStorage/binding.go | 127 +++--- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/IEigenPod/binding.go | 127 +++--- pkg/bindings/IEigenPodManager/binding.go | 332 +-------------- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- src/test/integration/IntegrationBase.t.sol | 56 ++- src/test/integration/IntegrationChecks.t.sol | 36 +- .../integration/IntegrationDeployer.t.sol | 8 +- .../integration/mocks/BeaconChainMock.t.sol | 11 +- .../VerifyWC_StartCP_CompleteCP.t.sol | 396 ++++++++++++++---- src/test/integration/users/User.t.sol | 42 +- 21 files changed, 623 insertions(+), 1360 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 4fb364c94..f2659170a 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212209b0eed3b73b412fd7522d30a39745bcccb6f8ab5a178f58bee49481f317bcd9564736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212208536dc62f571f91d17cdf69c7d9f957b76d36f66be94885d626ef2b1689aa09464736f6c634300080c0033", } // AVSDirectoryABI 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 3e17f63d9..7c5fc5b48 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: "[]", - Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220e2a5bafc2c049bb1a1c74ae5fd19ff521d07aea9dfe19f2603124edda3cb980c64736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122092f1bf8bdbb8ed57f4cfdd904586b6c5ebd855f30d851bae7aacb6d2b92a25fd64736f6c634300080c0033", } // BeaconChainProofsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go index 77e2a1a57..f7d67f0b6 100644 --- a/pkg/bindings/DelayedWithdrawalRouter/binding.go +++ b/pkg/bindings/DelayedWithdrawalRouter/binding.go @@ -44,7 +44,7 @@ type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { // DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. var DelayedWithdrawalRouterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220da1ffed298685352f743f6a75984650951cd450f564f6d466560f57e52a33df664736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea26469706673582212206659d5c395980dd8a87473a889557e49f84898f12e984648bf743a044c0f221564736f6c634300080c0033", } // DelayedWithdrawalRouterABI 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 29851cf05..61db14519 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,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\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220434b321e808b0ac3be4ef6ae9d2b2ec3204bf89c40045d456b9cbe8b8f12c9f964736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212207ae6b85a83f15c46a9a5042dbc992a3a6e615a28c7c1dc8587a9c583ab25ce0964736f6c634300080c0033", } // DelegationManagerABI 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 23c85ebbf..c85501271 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceContainerProof struct { + BalanceContainerRoot [32]byte + Proof []byte +} + // BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. type BeaconChainProofsBalanceProof struct { PubkeyHash [32]byte @@ -51,23 +57,23 @@ type BeaconChainProofsValidatorProof struct { // IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. type IEigenPodCheckpoint struct { BeaconBlockRoot [32]byte - PodBalanceGwei *big.Int - BalanceDeltasGwei *big.Int ProofsRemaining *big.Int + PodBalanceGwei uint64 + BalanceDeltasGwei *big.Int } // IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. type IEigenPodValidatorInfo struct { - ValidatorIndex uint64 - RestakedBalanceGwei uint64 - MostRecentBalanceUpdateTimestamp uint64 - Status uint8 + ValidatorIndex uint64 + RestakedBalanceGwei uint64 + LastCheckpointedAt uint64 + Status uint8 } // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"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\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"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\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b50604051620048d7380380620048d783398101604081905262000035916200014a565b6001600160a01b0380851660805283811660a052821660c0526001600160401b03811660e052620000656200006f565b50505050620001bd565b600054610100900460ff1615620000dc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156200012f576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014757600080fd5b50565b600080600080608085870312156200016157600080fd5b84516200016e8162000131565b6020860151909450620001818162000131565b6040860151909350620001948162000131565b60608601519092506001600160401b0381168114620001b257600080fd5b939692955090935050565b60805160a05160c05160e051614693620002446000396000610592015260008181610337015281816105cd0152818161098301528181610b4a01528181610e680152818161108301528181611179015281816114190152818161186101528181611a0a0152612dfb0152600061022f015260008181610444015261124401526146936000f3fe60806040526004361061016a5760003560e01c80636fcd0e53116100d1578063b522538a1161008a578063dda3346c11610064578063dda3346c14610520578063ee94d67c14610540578063f074ba6214610560578063f28824611461058057600080fd5b8063b522538a146104c0578063c4907442146104e0578063c4d66de81461050057600080fd5b80636fcd0e53146103ce5780637439841f146103fb57806374cdd7981461043257806387e0d2891461046657806388676cad1461048d5780639b4e4634146104ad57600080fd5b80633474aa16116101235780633474aa16146102a65780633f65cf19146102de57806342ecff2a146102fe5780634665bcda1461032557806347d283721461035957806358eaee79146103a157600080fd5b8063039157d2146101a95780630b18ff66146101cb5780630cd4649e146102085780631a5057be1461021d5780632340e8d3146102515780633106ab531461027557600080fd5b366101a4576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101b557600080fd5b506101c96101c43660046138fb565b6105b4565b005b3480156101d757600080fd5b506033546101eb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021457600080fd5b506101c961096a565b34801561022957600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561025d57600080fd5b5061026760395481565b6040519081526020016101ff565b34801561028157600080fd5b5060345461029690600160401b900460ff1681565b60405190151581526020016101ff565b3480156102b257600080fd5b506034546102c6906001600160401b031681565b6040516001600160401b0390911681526020016101ff565b3480156102ea57600080fd5b506101c96102f93660046139b9565b610b07565b34801561030a57600080fd5b50603a546102c690600160401b90046001600160401b031681565b34801561033157600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561036557600080fd5b5061036e610ed3565b6040516101ff91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b3480156103ad57600080fd5b506103c16103bc366004613ac8565b610f2e565b6040516101ff9190613b41565b3480156103da57600080fd5b506103ee6103e9366004613b4f565b610f93565b6040516101ff9190613b68565b34801561040757600080fd5b506103c1610416366004613b4f565b600090815260366020526040902054600160c01b900460ff1690565b34801561043e57600080fd5b506101eb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506033546102c690600160a01b90046001600160401b031681565b34801561049957600080fd5b506101c96104a8366004613bbe565b611040565b6101c96104bb366004613bdb565b61116e565b3480156104cc57600080fd5b506103ee6104db366004613ac8565b61131b565b3480156104ec57600080fd5b506101c96104fb366004613c6e565b61140e565b34801561050c57600080fd5b506101c961051b366004613c9a565b611646565b34801561052c57600080fd5b506101c961053b366004613d8b565b61181e565b34801561054c57600080fd5b50603a546102c6906001600160401b031681565b34801561056c57600080fd5b506101c961057b366004613e5c565b6119f1565b34801561058c57600080fd5b506102c67f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190613ec4565b156106665760405162461bcd60e51b815260040161065d90613ee1565b60405180910390fd5b60006106ac6106758480613f3e565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0592505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561071b5761071b613b09565b600281111561072c5761072c613b09565b8152505090506212750081604001516001600160401b031661074e9190613f9d565b866001600160401b0316116107cb5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c652079657400606482015260840161065d565b6001816060015160028111156107e3576107e3613b09565b1461084d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b606482015260840161065d565b61089161085a8580613f3e565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2992505050565b6109155760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a40161065d565b61093561092187611d53565b86356109306020890189613fb5565b611f09565b61095885356109448680613f3e565b6109516020890189613fb5565b8651612097565b61096260006122b8565b505050505050565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190613ec4565b15610a135760405162461bcd60e51b815260040161065d90613ee1565b6033546001600160a01b03163314610a3d5760405162461bcd60e51b815260040161065d90613ffb565b603454600160401b900460ff1615610aaf5760405162461bcd60e51b815260206004820152602f60248201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160448201526e1ada5b99c81a5cc8195b98589b1959608a1b606482015260840161065d565b6034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2610b0460006122b8565b50565b6033546001600160a01b03163314610b315760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610b99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbd9190613ec4565b15610bda5760405162461bcd60e51b815260040161065d90613ee1565b6034548990600160401b900460ff168015610c0b57506033546001600160401b03600160a01b909104811690821610155b610c275760405162461bcd60e51b815260040161065d90614043565b8685148015610c3557508483145b610cc55760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a40161065d565b603a546001600160401b03908116908b16118015610cf85750603a546001600160401b03600160401b9091048116908b16115b610d7f5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a40161065d565b610d9a610d8b8b611d53565b8a3561093060208d018d613fb5565b6000805b88811015610e3e57610e208c8c358c8c85818110610dbe57610dbe6140b7565b9050602002016020810190610dd391906140cd565b8b8b86818110610de557610de56140b7565b9050602002810190610df79190613fb5565b8b8b88818110610e0957610e096140b7565b9050602002810190610e1b9190613f3e565b61249f565b610e2a9083613f9d565b915080610e36816140f4565b915050610d9e565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610eae57600080fd5b505af1158015610ec2573d6000803e3d6000fd5b505050505050505050505050505050565b610f016040518060800160405280600080191681526020016000815260200160008152602001600081525090565b5060408051608081018252603b548152603c546020820152603d5491810191909152603e54606082015290565b600080610f7084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610fbb6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561102657611026613b09565b600281111561103757611037613b09565b90525092915050565b6033546001600160a01b0316331461106a5760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f69190613ec4565b156111135760405162461bcd60e51b815260040161065d90613ee1565b6034544290600160401b900460ff16801561114457506033546001600160401b03600160a01b909104811690821610155b6111605760405162461bcd60e51b815260040161065d90614043565b611169836122b8565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111b65760405162461bcd60e51b815260040161065d9061410f565b346801bc16d674ec800000146112425760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a40161065d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611285612a92565b8888886040518863ffffffff1660e01b81526004016112a9969594939291906141e1565b6000604051808303818588803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161130c929190614230565b60405180910390a15050505050565b6113436040805160808101825260008082526020820181905291810182905290606082015290565b6036600061138685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061299892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113f3576113f3613b09565b600281111561140457611404613b09565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114565760405162461bcd60e51b815260040161065d9061410f565b611464633b9aca008261425a565b156114ee5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a40161065d565b60006114fe633b9aca008361426e565b6034549091506001600160401b0390811690821611156115b75760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c40161065d565b603480548291906000906115d59084906001600160401b0316614282565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161163491815260200190565b60405180910390a26111698383612ad7565b600054610100900460ff16158080156116665750600054600160ff909116105b806116805750303b158015611680575060005460ff166001145b6116e35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065d565b6000805460ff191660011790558015611706576000805461ff0019166101001790555b6001600160a01b0382166117795760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b606482015260840161065d565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561181a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118485760405162461bcd60e51b815260040161065d90613ffb565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d49190613ec4565b156118f15760405162461bcd60e51b815260040161065d90613ee1565b825184511461197c5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a40161065d565b60005b84518110156119ea576119d88385838151811061199e5761199e6140b7565b60200260200101518784815181106119b8576119b86140b7565b60200260200101516001600160a01b0316612ae19092919063ffffffff16565b806119e2816140f4565b91505061197f565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7d9190613ec4565b15611a9a5760405162461bcd60e51b815260040161065d90613ee1565b603a54600160401b90046001600160401b031680611b465760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a40161065d565b60408051608081018252603b54808252603c54602080840191909152603d5493830193909352603e5460608301529091611b8a9190883590610930908a018a613fb5565b60005b84811015611cfb57600060366000888885818110611bad57611bad6140b7565b9050602002810190611bbf91906142aa565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611c2d57611c2d613b09565b6002811115611c3e57611c3e613b09565b9052509050600181606001516002811115611c5b57611c5b613b09565b14611c665750611ce9565b836001600160401b031681604001516001600160401b031610611c895750611ce9565b6000611cbb82868b358b8b88818110611ca457611ca46140b7565b9050602002810190611cb691906142aa565b612b33565b606085018051919250611ccd826142ca565b815250508084604001818151611ce391906142e1565b90525050505b80611cf3816140f4565b915050611b8d565b5061096281612d2a565b600081600081518110611d1a57611d1a6140b7565b60200260200101519050919050565b600081600381518110611d3e57611d3e6140b7565b60200260200101516000801b14159050919050565b6000611d62611fff600c614322565b611d756001600160401b03841642614341565b10611ddf5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b606482015260840161065d565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e2791614358565b600060405180830381855afa9150503d8060008114611e62576040519150601f19603f3d011682016040523d82523d6000602084013e611e67565b606091505b5091509150818015611e7a575060008151115b15611e9b5780806020019051810190611e93919061436a565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e656400000000000000606482015260840161065d565b611f1560036020614322565b8114611fa55760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a40161065d565b611fea82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925087915060039050612ebd565b6120915760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c40161065d565b50505050565b6120a360036002614467565b841461211c5760405162461bcd60e51b815260206004820152604e602482015260008051602061463e83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a40161065d565b600561212a60286001613f9d565b6121349190613f9d565b61213f906020614322565b82146121ad5760405162461bcd60e51b8152602060048201526043602482015260008051602061463e83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a40161065d565b600064ffffffffff82166121c360286001613f9d565b600b901b1790506000612208878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ed592505050565b905061224e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250859150869050612ebd565b6122ae5760405162461bcd60e51b815260206004820152603d602482015260008051602061463e83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f66000000606482015260840161065d565b5050505050505050565b603a54600160401b90046001600160401b0316156123595760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a40161065d565b6034546000906001600160401b0316612376633b9aca004761426e565b6123809190614341565b905081801561238d575080155b156124005760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e74000000606482015260840161065d565b6000604051806080016040528061241642611d53565b81526020810184905260006040820152603954606090910152603a80546fffffffffffffffff00000000000000001916600160401b426001600160401b031602179055905061246481612d2a565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124de848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d0592505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561254d5761254d613b09565b600281111561255e5761255e613b09565b905250905060008160600151600281111561257b5761257b613b09565b1461261e5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c40161065d565b6001600160401b03801661266486868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061318292505050565b6001600160401b0316146126ee5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a40161065d565b6126f6612a92565b6126ff90614473565b61273b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131a792505050565b146127bc5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a40161065d565b60006127fa8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131bc92505050565b905061280a8a87878b8b8e612097565b6039805490600061281a836140f4565b9091555060019050606083018190525064ffffffffff891682526001600160401b038b811660408085019182528383166020808701918252600088815260369091529190912085518154925193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b0319909416919095161791909117918216831781556060850151859391929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156128e1576128e1613b09565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8b1681526001600160401b038d8116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612989633b9aca006001600160401b038316614322565b9b9a5050505050505050505050565b60008151603014612a215760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a40161065d565b604051600290612a38908490600090602001614497565b60408051601f1981840301815290829052612a5291614358565b602060405180830381855afa158015612a6f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610f8d919061436a565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61181a82826131d4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526111699084906132ed565b835160208501516000919082612b4a8684876133bf565b6001600160401b0380821660208b0181905290891660408b0152909150612bc55760398054906000612b7b836142ca565b90915550506002606089015260405164ffffffffff8416906001600160401b038916907f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a90600090a35b84356000908152603660209081526040918290208a518154928c0151938c01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608b01518b9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612c6557612c65613b09565b02179055505060405164ffffffffff851691506001600160401b038916907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3816001600160401b0316816001600160401b031614612d1f576040805164ffffffffff851681526001600160401b03898116602083015283168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612d1c8183613556565b93505b505050949350505050565b6060810151612e9f576000633b9aca0082604001518360200151612d4e91906142e1565b612d5891906144c6565b6020830151603480549293509091600090612d7d9084906001600160401b031661454b565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603b819055603c819055603d819055603e5560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603b556020810151603c556040810151603d5560600151603e55565b600083612ecb86858561356e565b1495945050505050565b60008060028351612ee6919061426e565b90506000816001600160401b03811115612f0257612f02613cb7565b604051908082528060200260200182016040528015612f2b578160200160208202803683370190505b50905060005b8281101561303257600285612f468383614322565b81518110612f5657612f566140b7565b602002602001015186836002612f6c9190614322565b612f77906001613f9d565b81518110612f8757612f876140b7565b6020026020010151604051602001612fa9929190918252602082015260400190565b60408051601f1981840301815290829052612fc391614358565b602060405180830381855afa158015612fe0573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190613003919061436a565b828281518110613015576130156140b7565b60209081029190910101528061302a816140f4565b915050612f31565b5061303e60028361426e565b91505b811561315e5760005b8281101561314b5760028261305f8383614322565b8151811061306f5761306f6140b7565b6020026020010151838360026130859190614322565b613090906001613f9d565b815181106130a0576130a06140b7565b60200260200101516040516020016130c2929190918252602082015260400190565b60408051601f19818403018152908290526130dc91614358565b602060405180830381855afa1580156130f9573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061311c919061436a565b82828151811061312e5761312e6140b7565b602090810291909101015280613143816140f4565b91505061304a565b5061315760028361426e565b9150613041565b80600081518110613171576131716140b7565b602002602001015192505050919050565b6000610f8d8260068151811061319a5761319a6140b7565b60200260200101516136ba565b600081600181518110611d1a57611d1a6140b7565b6000610f8d8260028151811061319a5761319a6140b7565b804710156132245760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161065d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613271576040519150601f19603f3d011682016040523d82523d6000602084013e613276565b606091505b50509050806111695760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161065d565b6000613342826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137219092919063ffffffff16565b80519091501561116957808060200190518101906133609190613ec4565b6111695760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065d565b600060056133cf60266001613f9d565b6133d99190613f9d565b6133e4906020614322565b6133f16040840184613fb5565b9050146134625760405162461bcd60e51b81526020600482015260446024820181905260008051602061463e833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a40161065d565b600061346f600485614576565b64ffffffffff1690508061348560266001613f9d565b600c901b1790506134dd61349c6040850185613fb5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508992505050602086013584612ebd565b61353d5760405162461bcd60e51b815260206004820152603e602482015260008051602061463e83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f660000606482015260840161065d565b61354b836020013585613730565b9150505b9392505050565b600061354f6001600160401b0380841690851661459a565b6000835160001415801561358d57506020845161358b919061425a565b155b61361c5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a40161065d565b604080516020808201909252848152905b855181116136b05761364060028561425a565b613673578151600052808601516020526020826040600060026107d05a03fa61366857600080fd5b60028404935061369e565b8086015160005281516020526020826040600060026107d05a03fa61369757600080fd5b6002840493505b6136a9602082613f9d565b905061362d565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e93848460008561375d565b60008061373e6004846145d9565b6137499060406145fd565b64ffffffffff169050611e9384821b6136ba565b6060824710156137be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161065d565b6001600160a01b0385163b6138155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065d565b600080866001600160a01b031685876040516138319190614358565b60006040518083038185875af1925050503d806000811461386e576040519150601f19603f3d011682016040523d82523d6000602084013e613873565b606091505b509150915061388382828661388e565b979650505050505050565b6060831561389d57508161354f565b8251156138ad5782518084602001fd5b8160405162461bcd60e51b815260040161065d919061462a565b80356001600160401b03811681146138de57600080fd5b919050565b6000604082840312156138f557600080fd5b50919050565b60008060006060848603121561391057600080fd5b613919846138c7565b925060208401356001600160401b038082111561393557600080fd5b613941878388016138e3565b9350604086013591508082111561395757600080fd5b50613964868287016138e3565b9150509250925092565b60008083601f84011261398057600080fd5b5081356001600160401b0381111561399757600080fd5b6020830191508360208260051b85010111156139b257600080fd5b9250929050565b60008060008060008060008060a0898b0312156139d557600080fd5b6139de896138c7565b975060208901356001600160401b03808211156139fa57600080fd5b613a068c838d016138e3565b985060408b0135915080821115613a1c57600080fd5b613a288c838d0161396e565b909850965060608b0135915080821115613a4157600080fd5b613a4d8c838d0161396e565b909650945060808b0135915080821115613a6657600080fd5b50613a738b828c0161396e565b999c989b5096995094979396929594505050565b60008083601f840112613a9957600080fd5b5081356001600160401b03811115613ab057600080fd5b6020830191508360208285010111156139b257600080fd5b60008060208385031215613adb57600080fd5b82356001600160401b03811115613af157600080fd5b613afd85828601613a87565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613b3d57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610f8d8284613b1f565b600060208284031215613b6157600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613ba96060840182613b1f565b5092915050565b8015158114610b0457600080fd5b600060208284031215613bd057600080fd5b813561354f81613bb0565b600080600080600060608688031215613bf357600080fd5b85356001600160401b0380821115613c0a57600080fd5b613c1689838a01613a87565b90975095506020880135915080821115613c2f57600080fd5b50613c3c88828901613a87565b96999598509660400135949350505050565b6001600160a01b0381168114610b0457600080fd5b80356138de81613c4e565b60008060408385031215613c8157600080fd5b8235613c8c81613c4e565b946020939093013593505050565b600060208284031215613cac57600080fd5b813561354f81613c4e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cf557613cf5613cb7565b604052919050565b60006001600160401b03821115613d1657613d16613cb7565b5060051b60200190565b600082601f830112613d3157600080fd5b81356020613d46613d4183613cfd565b613ccd565b82815260059290921b84018101918181019086841115613d6557600080fd5b8286015b84811015613d805780358352918301918301613d69565b509695505050505050565b600080600060608486031215613da057600080fd5b83356001600160401b0380821115613db757600080fd5b818601915086601f830112613dcb57600080fd5b81356020613ddb613d4183613cfd565b82815260059290921b8401810191818101908a841115613dfa57600080fd5b948201945b83861015613e21578535613e1281613c4e565b82529482019490820190613dff565b97505087013592505080821115613e3757600080fd5b50613e4486828701613d20565b925050613e5360408501613c63565b90509250925092565b600080600060408486031215613e7157600080fd5b83356001600160401b0380821115613e8857600080fd5b613e94878388016138e3565b94506020860135915080821115613eaa57600080fd5b50613eb78682870161396e565b9497909650939450505050565b600060208284031215613ed657600080fd5b815161354f81613bb0565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e19843603018112613f5557600080fd5b8301803591506001600160401b03821115613f6f57600080fd5b6020019150600581901b36038213156139b257600080fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115613fb057613fb0613f87565b500190565b6000808335601e19843603018112613fcc57600080fd5b8301803591506001600160401b03821115613fe657600080fd5b6020019150368190038213156139b257600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252604e908201527f456967656e506f642e616674657252657374616b696e673a2074696d6573746160408201527f6d70206d757374206265206174206f722061667465722072657374616b696e6760608201526d081dd85cc81858dd1a5d985d195960921b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156140df57600080fd5b813564ffffffffff8116811461354f57600080fd5b600060001982141561410857614108613f87565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156141a457818101518382015260200161418c565b838111156120915750506000910152565b600081518084526141cd816020860160208601614189565b601f01601f19169290920160200192915050565b6080815260006141f560808301888a614160565b828103602084015261420781886141b5565b9050828103604084015261421c818688614160565b915050826060830152979650505050505050565b602081526000611e93602083018486614160565b634e487b7160e01b600052601260045260246000fd5b60008261426957614269614244565b500690565b60008261427d5761427d614244565b500490565b60006001600160401b03838116908316818110156142a2576142a2613f87565b039392505050565b60008235605e198336030181126142c057600080fd5b9190910192915050565b6000816142d9576142d9613f87565b506000190190565b600080821280156001600160ff1b038490038513161561430357614303613f87565b600160ff1b839003841281161561431c5761431c613f87565b50500190565b600081600019048311821515161561433c5761433c613f87565b500290565b60008282101561435357614353613f87565b500390565b600082516142c0818460208701614189565b60006020828403121561437c57600080fd5b5051919050565b600181815b808511156143be5781600019048211156143a4576143a4613f87565b808516156143b157918102915b93841c9390800290614388565b509250929050565b6000826143d557506001610f8d565b816143e257506000610f8d565b81600181146143f857600281146144025761441e565b6001915050610f8d565b60ff84111561441357614413613f87565b50506001821b610f8d565b5060208310610133831016604e8410600b8410161715614441575081810a610f8d565b61444b8383614383565b806000190482111561445f5761445f613f87565b029392505050565b600061354f83836143c6565b805160208083015191908110156138f55760001960209190910360031b1b16919050565b600083516144a9818460208801614189565b6001600160801b0319939093169190920190815260100192915050565b60006001600160ff1b03818413828413808216868404861116156144ec576144ec613f87565b600160ff1b600087128281168783058912161561450b5761450b613f87565b6000871292508782058712848416161561452757614527613f87565b8785058712818416161561453d5761453d613f87565b505050929093029392505050565b60006001600160401b0380831681851680830382111561456d5761456d613f87565b01949350505050565b600064ffffffffff8084168061458e5761458e614244565b92169190910492915050565b60008083128015600160ff1b8501841216156145b8576145b8613f87565b6001600160ff1b03840183138116156145d3576145d3613f87565b50500390565b600064ffffffffff808416806145f1576145f1614244565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561462157614621613f87565b02949350505050565b60208152600061354f60208301846141b556fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220ccd67325fb3c0d39c3403dd3ef4915bf6967aa9c780f851997d4ad7246ddf6d264736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + Bin: "0x60e06040523480156200001157600080fd5b506040516200492938038062004929833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147126200021760003960006105aa0152600081816102c8015281816105e5015281816109b701528181610cfe01528181610ebd01528181610fc201528181611262015281816116ae015281816118570152612f18015260008181610483015261108d01526147126000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613a5a565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b18565b610974565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613be6565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613c42565b610d68565b6040516101d99190613cbb565b34801561041957600080fd5b5061042d610428366004613cc9565b610dcd565b6040516101d99190613ce2565b34801561044657600080fd5b50610400610455366004613cc9565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613d38565b610e7a565b6101a36104d3366004613d55565b610fb7565b3480156104e457600080fd5b5061042d6104f3366004613c42565b611164565b34801561050457600080fd5b506101a3610513366004613de8565b611257565b34801561052457600080fd5b506101a3610533366004613e14565b611494565b34801561054457600080fd5b506101a3610553366004613f05565b61166b565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004613fd6565b61183e565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610658919061403e565b1561067e5760405162461bcd60e51b81526004016106759061405b565b60405180910390fd5b60006106c461068d84806140b8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bd292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561073357610733613c83565b600281111561074457610744613c83565b8152505090506212750081604001516001600160401b03166107669190614117565b866001600160401b0316116107e35760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156107fb576107fb613c83565b146108655760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b6108a961087285806140b8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bf692505050565b61092d5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b61093f61093987611c20565b86611dd6565b610962853561094e86806140b8565b61095b602089018961412f565b8651611f31565b61096c6000612148565b505050505050565b6033546001600160a01b0316331461099e5760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2a919061403e565b15610a475760405162461bcd60e51b81526004016106759061405b565b603454600160401b900460ff16610ac65760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610ad457508382145b610b645760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610b975750603a546001600160401b03600160401b9091048116908a16115b610c1e5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610c30610c2a8a611c20565b89611dd6565b6000805b87811015610cd457610cb68b8b358b8b85818110610c5457610c546141bd565b9050602002016020810190610c6991906141d3565b8a8a86818110610c7b57610c7b6141bd565b9050602002810190610c8d919061412f565b8a8a88818110610c9f57610c9f6141bd565b9050602002810190610cb191906140b8565b6123ca565b610cc09083614117565b915080610ccc816141fa565b915050610c34565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610d4457600080fd5b505af1158015610d58573d6000803e3d6000fd5b5050505050505050505050505050565b600080610daa84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610df56040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610e6057610e60613c83565b6002811115610e7157610e71613c83565b90525092915050565b6033546001600160a01b03163314610ea45760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f30919061403e565b15610f4d5760405162461bcd60e51b81526004016106759061405b565b610f5682612148565b603454600160401b900460ff16610fb3576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fff5760405162461bcd60e51b815260040161067590614215565b346801bc16d674ec8000001461108b5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876110ce612a12565b8888886040518863ffffffff1660e01b81526004016110f2969594939291906142eb565b6000604051808303818588803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161115592919061433a565b60405180910390a15050505050565b61118c6040805160808101825260008082526020820181905291810182905290606082015290565b603660006111cf85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561123c5761123c613c83565b600281111561124d5761124d613c83565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461129f5760405162461bcd60e51b815260040161067590614215565b6112ad633b9aca0082614364565b156113375760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b6000611347633b9aca0083614378565b6034549091506001600160401b0390811690821611156114005760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b6034805482919060009061141e9084906001600160401b031661438c565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161147d91815260200190565b60405180910390a261148f8383612a57565b505050565b600054610100900460ff16158080156114b45750600054600160ff909116105b806114ce5750303b1580156114ce575060005460ff166001145b6115315760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff191660011790558015611554576000805461ff0019166101001790555b6001600160a01b0382166115c75760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015610fb3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146116955760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611721919061403e565b1561173e5760405162461bcd60e51b81526004016106759061405b565b82518451146117c95760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b845181101561183757611825838583815181106117eb576117eb6141bd565b6020026020010151878481518110611805576118056141bd565b60200260200101516001600160a01b0316612a619092919063ffffffff16565b8061182f816141fa565b9150506117cc565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ca919061403e565b156118e75760405162461bcd60e51b81526004016106759061405b565b603a54600160401b90046001600160401b0316806119935760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b6060820152906119e39087612ab3565b6000805b85811015611b6f57600060366000898985818110611a0757611a076141bd565b9050602002810190611a1991906143b4565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611a8757611a87613c83565b6002811115611a9857611a98613c83565b9052509050600181606001516002811115611ab557611ab5613c83565b14611ac05750611b5d565b846001600160401b031681604001516001600160401b031610611ae35750611b5d565b600080611b1683888d358d8d89818110611aff57611aff6141bd565b9050602002810190611b1191906143b4565b612c2f565b602088018051929450909250611b2b826143d4565b62ffffff16905250606086018051839190611b479083906143f3565b600f0b905250611b578186614442565b94505050505b80611b67816141fa565b9150506119e7565b506001600160401b038084166000908152603b6020526040812080548493919291611b9c91859116614442565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550611bc982612e35565b50505050505050565b600081600081518110611be757611be76141bd565b60200260200101519050919050565b600081600381518110611c0b57611c0b6141bd565b60200260200101516000801b14159050919050565b6000611c2f611fff600c61446d565b611c426001600160401b0384164261448c565b10611cac5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611cf4916144a3565b600060405180830381855afa9150503d8060008114611d2f576040519150601f19603f3d011682016040523d82523d6000602084013e611d34565b606091505b5091509150818015611d47575060008151115b15611d685780806020019051810190611d6091906144b5565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b611de26003602061446d565b611def602083018361412f565b905014611e645760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611eb4611e74602083018361412f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692505084359050600361303c565b610fb35760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b60088414611fac5760405162461bcd60e51b815260206004820152604e60248201526000805160206146bd83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b6005611fba60286001614117565b611fc49190614117565b611fcf90602061446d565b821461203d5760405162461bcd60e51b815260206004820152604360248201526000805160206146bd83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061207b86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061305492505050565b9050600064ffffffffff831661209360286001614117565b600b901b1790506120de85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925086915085905061303c565b61213e5760405162461bcd60e51b815260206004820152603d60248201526000805160206146bd83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156121e95760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561226e5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661228b633b9aca0047614378565b612295919061438c565b90508180156122ab57506001600160401b038116155b1561231e5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061233442611c20565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061238f81612e35565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612409848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bd292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561247857612478613c83565b600281111561248957612489613c83565b90525090506000816060015160028111156124a6576124a6613c83565b146125495760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b03801661258f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330192505050565b6001600160401b0316146126195760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612621612a12565b61262a906144ce565b61266686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061332692505050565b146126e75760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061272586868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061333b92505050565b90506127358a87878b8b8e611f31565b60398054906000612745836141fa565b9091555050603a54600090600160401b90046001600160401b03161561277d57603a54600160401b90046001600160401b031661278a565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561286057612860613c83565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612908633b9aca006001600160401b03841661446d565b9c9b505050505050505050505050565b600081516030146129a15760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b6040516002906129b89084906000906020016144f2565b60408051601f19818403018152908290526129d2916144a3565b602060405180830381855afa1580156129ef573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dc791906144b5565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b610fb38282613353565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261148f90849061346c565b612abf60056003614117565b612aca90602061446d565b612ad7602083018361412f565b905014612b5a5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612bab612b6c602084018461412f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925050853590508461303c565b61148f5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612c4787848861353e565b9050816001600160401b0316816001600160401b031614612cc157612c6c81836136b5565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612d455760398054906000612cef83614521565b9091555050600260608a0152612d0485614538565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612de557612de5613c83565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff16612fbc576000633b9aca00826060015183604001516001600160401b0316612e6791906143f3565b600f0b612e74919061455f565b6040830151603480549293509091600090612e999084906001600160401b0316614442565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612f5e57600080fd5b505af1158015612f72573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b60008361304a8685856136cd565b1495945050505050565b600080600283516130659190614378565b90506000816001600160401b0381111561308157613081613e31565b6040519080825280602002602001820160405280156130aa578160200160208202803683370190505b50905060005b828110156131b1576002856130c5838361446d565b815181106130d5576130d56141bd565b6020026020010151868360026130eb919061446d565b6130f6906001614117565b81518110613106576131066141bd565b6020026020010151604051602001613128929190918252602082015260400190565b60408051601f1981840301815290829052613142916144a3565b602060405180830381855afa15801561315f573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061318291906144b5565b828281518110613194576131946141bd565b6020908102919091010152806131a9816141fa565b9150506130b0565b506131bd600283614378565b91505b81156132dd5760005b828110156132ca576002826131de838361446d565b815181106131ee576131ee6141bd565b602002602001015183836002613204919061446d565b61320f906001614117565b8151811061321f5761321f6141bd565b6020026020010151604051602001613241929190918252602082015260400190565b60408051601f198184030181529082905261325b916144a3565b602060405180830381855afa158015613278573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061329b91906144b5565b8282815181106132ad576132ad6141bd565b6020908102919091010152806132c2816141fa565b9150506131c9565b506132d6600283614378565b91506131c0565b806000815181106132f0576132f06141bd565b602002602001015192505050919050565b6000610dc782600681518110613319576133196141bd565b6020026020010151613819565b600081600181518110611be757611be76141bd565b6000610dc782600281518110613319576133196141bd565b804710156133a35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133f0576040519150601f19603f3d011682016040523d82523d6000602084013e6133f5565b606091505b505090508061148f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b60006134c1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138809092919063ffffffff16565b80519091501561148f57808060200190518101906134df919061403e565b61148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b600061354c60266001614117565b61355790602061446d565b613564604084018461412f565b9050146135d55760405162461bcd60e51b8152602060048201526044602482018190526000805160206146bd833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b60006135e26004856145e4565b64ffffffffff16905061363c6135fb604085018561412f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505060208601358461303c565b61369c5760405162461bcd60e51b815260206004820152603e60248201526000805160206146bd83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b6136aa83602001358561388f565b9150505b9392505050565b60006136ae6001600160401b03808416908516614608565b600083516000141580156136ec5750602084516136ea9190614364565b155b61377b5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b8551811161380f5761379f600285614364565b6137d2578151600052808601516020526020826040600060026107d05a03fa6137c757600080fd5b6002840493506137fd565b8086015160005281516020526020826040600060026107d05a03fa6137f657600080fd5b6002840493505b613808602082614117565b905061378c565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611d6084846000856138bc565b60008061389d600484614658565b6138a890604061467c565b64ffffffffff169050611d6084821b613819565b60608247101561391d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b0316858760405161399091906144a3565b60006040518083038185875af1925050503d80600081146139cd576040519150601f19603f3d011682016040523d82523d6000602084013e6139d2565b606091505b50915091506139e28282866139ed565b979650505050505050565b606083156139fc5750816136ae565b825115613a0c5782518084602001fd5b8160405162461bcd60e51b815260040161067591906146a9565b80356001600160401b0381168114613a3d57600080fd5b919050565b600060408284031215613a5457600080fd5b50919050565b600080600060608486031215613a6f57600080fd5b613a7884613a26565b925060208401356001600160401b0380821115613a9457600080fd5b613aa087838801613a42565b93506040860135915080821115613ab657600080fd5b50613ac386828701613a42565b9150509250925092565b60008083601f840112613adf57600080fd5b5081356001600160401b03811115613af657600080fd5b6020830191508360208260051b8501011115613b1157600080fd5b9250929050565b60008060008060008060008060a0898b031215613b3457600080fd5b613b3d89613a26565b975060208901356001600160401b0380821115613b5957600080fd5b613b658c838d01613a42565b985060408b0135915080821115613b7b57600080fd5b613b878c838d01613acd565b909850965060608b0135915080821115613ba057600080fd5b613bac8c838d01613acd565b909650945060808b0135915080821115613bc557600080fd5b50613bd28b828c01613acd565b999c989b5096995094979396929594505050565b600060208284031215613bf857600080fd5b6136ae82613a26565b60008083601f840112613c1357600080fd5b5081356001600160401b03811115613c2a57600080fd5b602083019150836020828501011115613b1157600080fd5b60008060208385031215613c5557600080fd5b82356001600160401b03811115613c6b57600080fd5b613c7785828601613c01565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613cb757634e487b7160e01b600052602160045260246000fd5b9052565b60208101610dc78284613c99565b600060208284031215613cdb57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613d236060840182613c99565b5092915050565b801515811461303957600080fd5b600060208284031215613d4a57600080fd5b81356136ae81613d2a565b600080600080600060608688031215613d6d57600080fd5b85356001600160401b0380821115613d8457600080fd5b613d9089838a01613c01565b90975095506020880135915080821115613da957600080fd5b50613db688828901613c01565b96999598509660400135949350505050565b6001600160a01b038116811461303957600080fd5b8035613a3d81613dc8565b60008060408385031215613dfb57600080fd5b8235613e0681613dc8565b946020939093013593505050565b600060208284031215613e2657600080fd5b81356136ae81613dc8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e6f57613e6f613e31565b604052919050565b60006001600160401b03821115613e9057613e90613e31565b5060051b60200190565b600082601f830112613eab57600080fd5b81356020613ec0613ebb83613e77565b613e47565b82815260059290921b84018101918181019086841115613edf57600080fd5b8286015b84811015613efa5780358352918301918301613ee3565b509695505050505050565b600080600060608486031215613f1a57600080fd5b83356001600160401b0380821115613f3157600080fd5b818601915086601f830112613f4557600080fd5b81356020613f55613ebb83613e77565b82815260059290921b8401810191818101908a841115613f7457600080fd5b948201945b83861015613f9b578535613f8c81613dc8565b82529482019490820190613f79565b97505087013592505080821115613fb157600080fd5b50613fbe86828701613e9a565b925050613fcd60408501613ddd565b90509250925092565b600080600060408486031215613feb57600080fd5b83356001600160401b038082111561400257600080fd5b61400e87838801613a42565b9450602086013591508082111561402457600080fd5b5061403186828701613acd565b9497909650939450505050565b60006020828403121561405057600080fd5b81516136ae81613d2a565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e198436030181126140cf57600080fd5b8301803591506001600160401b038211156140e957600080fd5b6020019150600581901b3603821315613b1157600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561412a5761412a614101565b500190565b6000808335601e1984360301811261414657600080fd5b8301803591506001600160401b0382111561416057600080fd5b602001915036819003821315613b1157600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141e557600080fd5b813564ffffffffff811681146136ae57600080fd5b600060001982141561420e5761420e614101565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156142aa578181015183820152602001614292565b838111156142b9576000848401525b50505050565b600081518084526142d781602086016020860161428f565b601f01601f19169290920160200192915050565b6080815260006142ff60808301888a614266565b828103602084015261431181886142bf565b90508281036040840152614326818688614266565b915050826060830152979650505050505050565b602081526000611d60602083018486614266565b634e487b7160e01b600052601260045260246000fd5b6000826143735761437361434e565b500690565b6000826143875761438761434e565b500490565b60006001600160401b03838116908316818110156143ac576143ac614101565b039392505050565b60008235605e198336030181126143ca57600080fd5b9190910192915050565b600062ffffff8216806143e9576143e9614101565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561441d5761441d614101565b8260016001607f1b031903821281161561443957614439614101565b50019392505050565b60006001600160401b0380831681851680830382111561446457614464614101565b01949350505050565b600081600019048311821515161561448757614487614101565b500290565b60008282101561449e5761449e614101565b500390565b600082516143ca81846020870161428f565b6000602082840312156144c757600080fd5b5051919050565b80516020808301519190811015613a545760001960209190910360031b1b16919050565b6000835161450481846020880161428f565b6001600160801b0319939093169190920190815260100192915050565b60008161453057614530614101565b506000190190565b600081600f0b60016001607f1b031981141561455657614556614101565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561458557614585614101565b600160ff1b60008712828116878305891216156145a4576145a4614101565b600087129250878205871284841616156145c0576145c0614101565b878505871281841616156145d6576145d6614101565b505050929093029392505050565b600064ffffffffff808416806145fc576145fc61434e565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561463357614633614101565b8160016001607f1b0301831381161561464e5761464e614101565b5090039392505050565b600064ffffffffff808416806146705761467061434e565b92169190910692915050565b600064ffffffffff808316818516818304811182151516156146a0576146a0614101565b02949350505050565b6020815260006136ae60208301846142bf56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220e7fb097b8f357555160a99d255cbd73600b1e7b58eeaa1b52ccec889f1e8ba7064736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. @@ -79,7 +85,7 @@ var EigenPodABI = EigenPodMetaData.ABI var EigenPodBin = EigenPodMetaData.Bin // DeployEigenPod deploys a new Ethereum contract, binding an instance of EigenPod to it. -func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _delayedWithdrawalRouter common.Address, _eigenPodManager common.Address, _GENESIS_TIME uint64) (common.Address, *types.Transaction, *EigenPod, error) { +func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethPOS common.Address, _eigenPodManager common.Address, _GENESIS_TIME uint64) (common.Address, *types.Transaction, *EigenPod, error) { parsed, err := EigenPodMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -88,7 +94,7 @@ func DeployEigenPod(auth *bind.TransactOpts, backend bind.ContractBackend, _ethP return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _GENESIS_TIME) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EigenPodBin), backend, _ethPOS, _eigenPodManager, _GENESIS_TIME) if err != nil { return common.Address{}, nil, nil, err } @@ -299,9 +305,40 @@ func (_EigenPod *EigenPodCallerSession) ActiveValidatorCount() (*big.Int, error) return _EigenPod.Contract.ActiveValidatorCount(&_EigenPod.CallOpts) } +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPod *EigenPodCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error) { + var out []interface{} + err := _EigenPod.contract.Call(opts, &out, "checkpointBalanceExitedGwei", arg0) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPod *EigenPodSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _EigenPod.Contract.CheckpointBalanceExitedGwei(&_EigenPod.CallOpts, arg0) +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPod *EigenPodCallerSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _EigenPod.Contract.CheckpointBalanceExitedGwei(&_EigenPod.CallOpts, arg0) +} + // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPod *EigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { var out []interface{} err := _EigenPod.contract.Call(opts, &out, "currentCheckpoint") @@ -318,14 +355,14 @@ func (_EigenPod *EigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenP // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPod *EigenPodSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _EigenPod.Contract.CurrentCheckpoint(&_EigenPod.CallOpts) } // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPod *EigenPodCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _EigenPod.Contract.CurrentCheckpoint(&_EigenPod.CallOpts) } @@ -361,37 +398,6 @@ func (_EigenPod *EigenPodCallerSession) CurrentCheckpointTimestamp() (uint64, er return _EigenPod.Contract.CurrentCheckpointTimestamp(&_EigenPod.CallOpts) } -// DelayedWithdrawalRouter is a free data retrieval call binding the contract method 0x1a5057be. -// -// Solidity: function delayedWithdrawalRouter() view returns(address) -func (_EigenPod *EigenPodCaller) DelayedWithdrawalRouter(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "delayedWithdrawalRouter") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// DelayedWithdrawalRouter is a free data retrieval call binding the contract method 0x1a5057be. -// -// Solidity: function delayedWithdrawalRouter() view returns(address) -func (_EigenPod *EigenPodSession) DelayedWithdrawalRouter() (common.Address, error) { - return _EigenPod.Contract.DelayedWithdrawalRouter(&_EigenPod.CallOpts) -} - -// DelayedWithdrawalRouter is a free data retrieval call binding the contract method 0x1a5057be. -// -// Solidity: function delayedWithdrawalRouter() view returns(address) -func (_EigenPod *EigenPodCallerSession) DelayedWithdrawalRouter() (common.Address, error) { - return _EigenPod.Contract.DelayedWithdrawalRouter(&_EigenPod.CallOpts) -} - // EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. // // Solidity: function eigenPodManager() view returns(address) @@ -516,37 +522,6 @@ func (_EigenPod *EigenPodCallerSession) LastCheckpointTimestamp() (uint64, error return _EigenPod.Contract.LastCheckpointTimestamp(&_EigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPod *EigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPod.Contract.MostRecentWithdrawalTimestamp(&_EigenPod.CallOpts) -} - // PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. // // Solidity: function podOwner() view returns(address) @@ -733,27 +708,6 @@ func (_EigenPod *EigenPodCallerSession) WithdrawableRestakedExecutionLayerGwei() return _EigenPod.Contract.WithdrawableRestakedExecutionLayerGwei(&_EigenPod.CallOpts) } -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPod *EigenPodTransactor) ActivateRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "activateRestaking") -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPod *EigenPodSession) ActivateRestaking() (*types.Transaction, error) { - return _EigenPod.Contract.ActivateRestaking(&_EigenPod.TransactOpts) -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPod *EigenPodTransactorSession) ActivateRestaking() (*types.Transaction, error) { - return _EigenPod.Contract.ActivateRestaking(&_EigenPod.TransactOpts) -} - // Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. // // Solidity: function initialize(address _podOwner) returns() @@ -840,23 +794,23 @@ func (_EigenPod *EigenPodTransactorSession) StartCheckpoint(revertIfNoBalance bo // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPod *EigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPod.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.contract.Transact(opts, "verifyCheckpointProofs", balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPod *EigenPodSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPod *EigenPodTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPod *EigenPodTransactorSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPod.Contract.VerifyCheckpointProofs(&_EigenPod.TransactOpts, balanceContainerProof, proofs) } // VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index ec966f0ab..2658e2aff 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -31,8 +31,8 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"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\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b506040516200328c3803806200328c83398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e0516101005161304b62000241600039600081816105b50152818161065f01528181610bac015281816114850152818161190901526119f901526000610541015260006102e5015260008181610279015281816114040152611f7d01526000610413015261304b6000f3fe6080604052600436106101cd5760003560e01c806384d81062116100f7578063a6a509be11610095578063ea4d3c9b11610064578063ea4d3c9b146105a3578063f2fde38b146105d7578063f6848d24146105f7578063fabc1cbc1461063257600080fd5b8063a6a509be14610519578063b13442711461052f578063beffbb8914610563578063c2c51c401461058357600080fd5b80639104c319116100d15780639104c319146104885780639b4e4634146104b05780639ba06275146104c3578063a38406a3146104f957600080fd5b806384d8106214610435578063886f11951461044a5780638da5cb5b1461046a57600080fd5b806344e71c801161016f5780635c975abb1161013e5780635c975abb146103aa57806360f4062b146103bf578063715018a6146103ec57806374cdd7981461040157600080fd5b806344e71c8014610307578063463db03814610335578063595c6a67146103555780635ac86ab71461036a57600080fd5b80631794bb3c116101ab5780631794bb3c14610247578063292b7b2b14610267578063387b1300146102b357806339b70e38146102d357600080fd5b80630e81073c146101d257806310d67a2f14610205578063136439dd14610227575b600080fd5b3480156101de57600080fd5b506101f26101ed366004612215565b610652565b6040519081526020015b60405180910390f35b34801561021157600080fd5b50610225610220366004612241565b610890565b005b34801561023357600080fd5b5061022561024236600461225e565b610943565b34801561025357600080fd5b50610225610262366004612277565b610a82565b34801561027357600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101fc565b3480156102bf57600080fd5b506102256102ce366004612277565b610ba1565b3480156102df57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031357600080fd5b5061031c610f3f565b60405167ffffffffffffffff90911681526020016101fc565b34801561034157600080fd5b506102256103503660046122b8565b610f68565b34801561036157600080fd5b506102256110f4565b34801561037657600080fd5b5061039a6103853660046122e2565b606654600160ff9092169190911b9081161490565b60405190151581526020016101fc565b3480156103b657600080fd5b506066546101f2565b3480156103cb57600080fd5b506101f26103da366004612241565b609b6020526000908152604090205481565b3480156103f857600080fd5b506102256111bb565b34801561040d57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044157600080fd5b5061029b6111cf565b34801561045657600080fd5b5060655461029b906001600160a01b031681565b34801561047657600080fd5b506033546001600160a01b031661029b565b34801561049457600080fd5b5061029b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102256104be36600461234e565b6112b9565b3480156104cf57600080fd5b5061029b6104de366004612241565b6098602052600090815260409020546001600160a01b031681565b34801561050557600080fd5b5061029b610514366004612241565b6113a8565b34801561052557600080fd5b506101f260995481565b34801561053b57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056f57600080fd5b5061022561057e366004612215565b61147a565b34801561058f57600080fd5b5061022561059e366004612215565b611691565b3480156105af57600080fd5b5061029b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506102256105f2366004612241565b611a94565b34801561060357600080fd5b5061039a610612366004612241565b6001600160a01b0390811660009081526098602052604090205416151590565b34801561063e57600080fd5b5061022561064d36600461225e565b611b0a565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106a55760405162461bcd60e51b815260040161069c906123c2565b60405180910390fd5b6001600160a01b0383166107215760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161069c565b600082121561078f5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161069c565b61079d633b9aca0083612436565b156108105760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161069c565b6001600160a01b0383166000908152609b6020526040812054906108348483612460565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612fd6833981519152906108739087815260200190565b60405180910390a26108858282611c66565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090791906124a1565b6001600160a01b0316336001600160a01b0316146109375760405162461bcd60e51b815260040161069c906124be565b61094081611ca8565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190612508565b6109cb5760405162461bcd60e51b815260040161069c9061252a565b60665481811614610a445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161069c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610aa25750600054600160ff909116105b80610abc5750303b158015610abc575060005460ff166001145b610b1f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161069c565b6000805460ff191660011790558015610b42576000805461ff0019166101001790555b610b4b84611d9f565b610b558383611df1565b8015610b9b576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be95760405162461bcd60e51b815260040161069c906123c2565b6001600160a01b038316610c635760405162461bcd60e51b81526020600482015260476024820152600080516020612ff683398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161069c565b6001600160a01b038216610ce05760405162461bcd60e51b815260206004820152604a6024820152600080516020612ff683398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161069c565b6000811215610d4f5760405162461bcd60e51b81526020600482015260416024820152600080516020612ff683398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161069c565b610d5d633b9aca0082612436565b15610dd15760405162461bcd60e51b815260206004820152604a6024820152600080516020612ff683398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161069c565b6001600160a01b0383166000908152609b602052604081205490811215610ec4576000610dfd82612572565b905080831115610e62576001600160a01b0385166000908152609b6020526040812055610e2a818461258f565b9250846001600160a01b0316600080516020612fd683398151915282604051610e5591815260200190565b60405180910390a2610ec2565b6001600160a01b0385166000908152609b602052604081208054859290610e8a908490612460565b90915550506040518381526001600160a01b03861690600080516020612fd68339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610f2157600080fd5b505af1158015610f35573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610f635767ffffffffffffffff91505090565b919050565b610f70611edb565b67ffffffffffffffff81166110025760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161069c565b609c5467ffffffffffffffff161561109e5760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161069c565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561113c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111609190612508565b61117c5760405162461bcd60e51b815260040161069c9061252a565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6111c3611edb565b6111cd6000611d9f565b565b6066546000908190600190811614156112265760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161069c565b336000908152609860205260409020546001600160a01b0316156112a85760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161069c565b60006112b2611f35565b9250505090565b6066546000906001908116141561130e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161069c565b336000908152609860205260409020546001600160a01b03168061133757611334611f35565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e463490349061136d908b908b908b908b908b906004016125cf565b6000604051808303818588803b15801561138657600080fd5b505af115801561139a573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061088a57611473836001600160a01b031660001b60405180610940016040528061090e81526020016126c861090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526114589291602001612644565b6040516020818303038152906040528051906020012061209a565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114c25760405162461bcd60e51b815260040161069c906123c2565b60008112156115395760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161069c565b611547633b9aca0082612436565b156115bc576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161069c565b6001600160a01b0382166000908152609b60205260408120546115e0908390612659565b905060008112156116715760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161069c565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b03808316600090815260986020526040902054839116331461170c5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161069c565b600260c954141561175f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161069c565b600260c9556001600160a01b0383166117fb5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161069c565b611809633b9aca0083612698565b156118a25760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161069c565b6001600160a01b0383166000908152609b6020526040812054906118c68483612460565b6001600160a01b0386166000908152609b602052604081208290559091506118ee8383611c66565b90508015611a565760008112156119b9576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061194d85612572565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561199c57600080fd5b505af11580156119b0573d6000803e3d6000fd5b50505050611a56565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611a3d57600080fd5b505af1158015611a51573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612fd683398151915286604051611a7f91815260200190565b60405180910390a25050600160c95550505050565b611a9c611edb565b6001600160a01b038116611b015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161069c565b61094081611d9f565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8191906124a1565b6001600160a01b0316336001600160a01b031614611bb15760405162461bcd60e51b815260040161069c906124be565b606654198119606654191614611c2f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161069c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a77565b6000808313611c865760008213611c7f5750600061088a565b508061088a565b60008213611c9e57611c9783612572565b905061088a565b611c978383612659565b6001600160a01b038116611d365760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161069c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611e1257506001600160a01b03821615155b611e945760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161069c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611ed782611ca8565b5050565b6033546001600160a01b031633146111cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161069c565b6000609960008154611f46906126ac565b9091555060408051610940810190915261090e808252600091611fe591839133916126c86020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611fd19291602001612644565b6040516020818303038152906040526120f6565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b15801561202957600080fd5b505af115801561203d573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b1660218301526035820185905260558083018590528351808403909101815260759092019092528051910120600090611473565b600080844710156121495760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161069c565b82516121975760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161069c565b8383516020850187f590506001600160a01b0381166121f85760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161069c565b949350505050565b6001600160a01b038116811461094057600080fd5b6000806040838503121561222857600080fd5b823561223381612200565b946020939093013593505050565b60006020828403121561225357600080fd5b813561147381612200565b60006020828403121561227057600080fd5b5035919050565b60008060006060848603121561228c57600080fd5b833561229781612200565b925060208401356122a781612200565b929592945050506040919091013590565b6000602082840312156122ca57600080fd5b813567ffffffffffffffff8116811461147357600080fd5b6000602082840312156122f457600080fd5b813560ff8116811461147357600080fd5b60008083601f84011261231757600080fd5b50813567ffffffffffffffff81111561232f57600080fd5b60208301915083602082850101111561234757600080fd5b9250929050565b60008060008060006060868803121561236657600080fd5b853567ffffffffffffffff8082111561237e57600080fd5b61238a89838a01612305565b909750955060208801359150808211156123a357600080fd5b506123b088828901612305565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261244557612445612420565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156124825761248261244a565b600160ff1b839003841281161561249b5761249b61244a565b50500190565b6000602082840312156124b357600080fd5b815161147381612200565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561251a57600080fd5b8151801515811461147357600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156125885761258861244a565b5060000390565b6000828210156125a1576125a161244a565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006125e36060830187896125a6565b82810360208401526125f68186886125a6565b9150508260408301529695505050505050565b6000815160005b8181101561262a5760208185018101518683015201612610565b81811115612639576000828601525b509290920192915050565b60006121f86126538386612609565b84612609565b60008083128015600160ff1b8501841216156126775761267761244a565b6001600160ff1b03840183138116156126925761269261244a565b50500390565b6000826126a7576126a7612420565b500790565b60006000198214156126c0576126c061244a565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220cf5293403b376506835b615be40b9da5e201d4c3a5b734ac5795ff70c85be82d64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220be6e4f910f8ea4ea6f616543576975a29385c2cb33cc66c6425cd3cc8ff30df264736f6c634300080c0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. @@ -264,37 +264,6 @@ func (_EigenPodManager *EigenPodManagerCallerSession) DelegationManager() (commo return _EigenPodManager.Contract.DelegationManager(&_EigenPodManager.CallOpts) } -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManager *EigenPodManagerCaller) DenebForkTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _EigenPodManager.contract.Call(opts, &out, "denebForkTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManager *EigenPodManagerSession) DenebForkTimestamp() (uint64, error) { - return _EigenPodManager.Contract.DenebForkTimestamp(&_EigenPodManager.CallOpts) -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManager *EigenPodManagerCallerSession) DenebForkTimestamp() (uint64, error) { - return _EigenPodManager.Contract.DenebForkTimestamp(&_EigenPodManager.CallOpts) -} - // EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. // // Solidity: function eigenPodBeacon() view returns(address) @@ -866,27 +835,6 @@ func (_EigenPodManager *EigenPodManagerTransactorSession) RenounceOwnership() (* return _EigenPodManager.Contract.RenounceOwnership(&_EigenPodManager.TransactOpts) } -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManager *EigenPodManagerTransactor) SetDenebForkTimestamp(opts *bind.TransactOpts, newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManager.contract.Transact(opts, "setDenebForkTimestamp", newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManager *EigenPodManagerSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManager.Contract.SetDenebForkTimestamp(&_EigenPodManager.TransactOpts, newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManager *EigenPodManagerTransactorSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManager.Contract.SetDenebForkTimestamp(&_EigenPodManager.TransactOpts, newDenebForkTimestamp) -} - // SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. // // Solidity: function setPauserRegistry(address newPauserRegistry) returns() @@ -1286,284 +1234,6 @@ func (_EigenPodManager *EigenPodManagerFilterer) ParseBeaconChainETHWithdrawalCo return event, nil } -// EigenPodManagerBeaconOracleUpdatedIterator is returned from FilterBeaconOracleUpdated and is used to iterate over the raw logs and unpacked data for BeaconOracleUpdated events raised by the EigenPodManager contract. -type EigenPodManagerBeaconOracleUpdatedIterator struct { - Event *EigenPodManagerBeaconOracleUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodManagerBeaconOracleUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodManagerBeaconOracleUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodManagerBeaconOracleUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodManagerBeaconOracleUpdated represents a BeaconOracleUpdated event raised by the EigenPodManager contract. -type EigenPodManagerBeaconOracleUpdated struct { - NewOracleAddress common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconOracleUpdated is a free log retrieval operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManager *EigenPodManagerFilterer) FilterBeaconOracleUpdated(opts *bind.FilterOpts, newOracleAddress []common.Address) (*EigenPodManagerBeaconOracleUpdatedIterator, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _EigenPodManager.contract.FilterLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return &EigenPodManagerBeaconOracleUpdatedIterator{contract: _EigenPodManager.contract, event: "BeaconOracleUpdated", logs: logs, sub: sub}, nil -} - -// WatchBeaconOracleUpdated is a free log subscription operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManager *EigenPodManagerFilterer) WatchBeaconOracleUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerBeaconOracleUpdated, newOracleAddress []common.Address) (event.Subscription, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _EigenPodManager.contract.WatchLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodManagerBeaconOracleUpdated) - if err := _EigenPodManager.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBeaconOracleUpdated is a log parse operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManager *EigenPodManagerFilterer) ParseBeaconOracleUpdated(log types.Log) (*EigenPodManagerBeaconOracleUpdated, error) { - event := new(EigenPodManagerBeaconOracleUpdated) - if err := _EigenPodManager.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// EigenPodManagerDenebForkTimestampUpdatedIterator is returned from FilterDenebForkTimestampUpdated and is used to iterate over the raw logs and unpacked data for DenebForkTimestampUpdated events raised by the EigenPodManager contract. -type EigenPodManagerDenebForkTimestampUpdatedIterator struct { - Event *EigenPodManagerDenebForkTimestampUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodManagerDenebForkTimestampUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodManagerDenebForkTimestampUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodManagerDenebForkTimestampUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodManagerDenebForkTimestampUpdated represents a DenebForkTimestampUpdated event raised by the EigenPodManager contract. -type EigenPodManagerDenebForkTimestampUpdated struct { - NewValue uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDenebForkTimestampUpdated is a free log retrieval operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManager *EigenPodManagerFilterer) FilterDenebForkTimestampUpdated(opts *bind.FilterOpts) (*EigenPodManagerDenebForkTimestampUpdatedIterator, error) { - - logs, sub, err := _EigenPodManager.contract.FilterLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return &EigenPodManagerDenebForkTimestampUpdatedIterator{contract: _EigenPodManager.contract, event: "DenebForkTimestampUpdated", logs: logs, sub: sub}, nil -} - -// WatchDenebForkTimestampUpdated is a free log subscription operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManager *EigenPodManagerFilterer) WatchDenebForkTimestampUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerDenebForkTimestampUpdated) (event.Subscription, error) { - - logs, sub, err := _EigenPodManager.contract.WatchLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodManagerDenebForkTimestampUpdated) - if err := _EigenPodManager.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDenebForkTimestampUpdated is a log parse operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManager *EigenPodManagerFilterer) ParseDenebForkTimestampUpdated(log types.Log) (*EigenPodManagerDenebForkTimestampUpdated, error) { - event := new(EigenPodManagerDenebForkTimestampUpdated) - if err := _EigenPodManager.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // EigenPodManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the EigenPodManager contract. type EigenPodManagerInitializedIterator struct { Event *EigenPodManagerInitialized // Event containing the contract specifics and raw log diff --git a/pkg/bindings/EigenPodManagerStorage/binding.go b/pkg/bindings/EigenPodManagerStorage/binding.go index c334500d8..8d8f6cf65 100644 --- a/pkg/bindings/EigenPodManagerStorage/binding.go +++ b/pkg/bindings/EigenPodManagerStorage/binding.go @@ -31,7 +31,7 @@ var ( // EigenPodManagerStorageMetaData contains all meta data concerning the EigenPodManagerStorage contract. var EigenPodManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", } // EigenPodManagerStorageABI is the input ABI used to generate the binding from. @@ -242,37 +242,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) DelegationMa return _EigenPodManagerStorage.Contract.DelegationManager(&_EigenPodManagerStorage.CallOpts) } -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManagerStorage *EigenPodManagerStorageCaller) DenebForkTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _EigenPodManagerStorage.contract.Call(opts, &out, "denebForkTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) DenebForkTimestamp() (uint64, error) { - return _EigenPodManagerStorage.Contract.DenebForkTimestamp(&_EigenPodManagerStorage.CallOpts) -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_EigenPodManagerStorage *EigenPodManagerStorageCallerSession) DenebForkTimestamp() (uint64, error) { - return _EigenPodManagerStorage.Contract.DenebForkTimestamp(&_EigenPodManagerStorage.CallOpts) -} - // EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. // // Solidity: function eigenPodBeacon() view returns(address) @@ -771,27 +740,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) RemoveSh return _EigenPodManagerStorage.Contract.RemoveShares(&_EigenPodManagerStorage.TransactOpts, podOwner, shares) } -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactor) SetDenebForkTimestamp(opts *bind.TransactOpts, newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManagerStorage.contract.Transact(opts, "setDenebForkTimestamp", newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.SetDenebForkTimestamp(&_EigenPodManagerStorage.TransactOpts, newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_EigenPodManagerStorage *EigenPodManagerStorageTransactorSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _EigenPodManagerStorage.Contract.SetDenebForkTimestamp(&_EigenPodManagerStorage.TransactOpts, newDenebForkTimestamp) -} - // SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. // // Solidity: function setPauserRegistry(address newPauserRegistry) returns() @@ -1170,284 +1118,6 @@ func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBeaconChainE return event, nil } -// EigenPodManagerStorageBeaconOracleUpdatedIterator is returned from FilterBeaconOracleUpdated and is used to iterate over the raw logs and unpacked data for BeaconOracleUpdated events raised by the EigenPodManagerStorage contract. -type EigenPodManagerStorageBeaconOracleUpdatedIterator struct { - Event *EigenPodManagerStorageBeaconOracleUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodManagerStorageBeaconOracleUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerStorageBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerStorageBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodManagerStorageBeaconOracleUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodManagerStorageBeaconOracleUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodManagerStorageBeaconOracleUpdated represents a BeaconOracleUpdated event raised by the EigenPodManagerStorage contract. -type EigenPodManagerStorageBeaconOracleUpdated struct { - NewOracleAddress common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconOracleUpdated is a free log retrieval operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterBeaconOracleUpdated(opts *bind.FilterOpts, newOracleAddress []common.Address) (*EigenPodManagerStorageBeaconOracleUpdatedIterator, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _EigenPodManagerStorage.contract.FilterLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return &EigenPodManagerStorageBeaconOracleUpdatedIterator{contract: _EigenPodManagerStorage.contract, event: "BeaconOracleUpdated", logs: logs, sub: sub}, nil -} - -// WatchBeaconOracleUpdated is a free log subscription operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchBeaconOracleUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageBeaconOracleUpdated, newOracleAddress []common.Address) (event.Subscription, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _EigenPodManagerStorage.contract.WatchLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodManagerStorageBeaconOracleUpdated) - if err := _EigenPodManagerStorage.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBeaconOracleUpdated is a log parse operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseBeaconOracleUpdated(log types.Log) (*EigenPodManagerStorageBeaconOracleUpdated, error) { - event := new(EigenPodManagerStorageBeaconOracleUpdated) - if err := _EigenPodManagerStorage.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// EigenPodManagerStorageDenebForkTimestampUpdatedIterator is returned from FilterDenebForkTimestampUpdated and is used to iterate over the raw logs and unpacked data for DenebForkTimestampUpdated events raised by the EigenPodManagerStorage contract. -type EigenPodManagerStorageDenebForkTimestampUpdatedIterator struct { - Event *EigenPodManagerStorageDenebForkTimestampUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodManagerStorageDenebForkTimestampUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerStorageDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodManagerStorageDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodManagerStorageDenebForkTimestampUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodManagerStorageDenebForkTimestampUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodManagerStorageDenebForkTimestampUpdated represents a DenebForkTimestampUpdated event raised by the EigenPodManagerStorage contract. -type EigenPodManagerStorageDenebForkTimestampUpdated struct { - NewValue uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDenebForkTimestampUpdated is a free log retrieval operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) FilterDenebForkTimestampUpdated(opts *bind.FilterOpts) (*EigenPodManagerStorageDenebForkTimestampUpdatedIterator, error) { - - logs, sub, err := _EigenPodManagerStorage.contract.FilterLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return &EigenPodManagerStorageDenebForkTimestampUpdatedIterator{contract: _EigenPodManagerStorage.contract, event: "DenebForkTimestampUpdated", logs: logs, sub: sub}, nil -} - -// WatchDenebForkTimestampUpdated is a free log subscription operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) WatchDenebForkTimestampUpdated(opts *bind.WatchOpts, sink chan<- *EigenPodManagerStorageDenebForkTimestampUpdated) (event.Subscription, error) { - - logs, sub, err := _EigenPodManagerStorage.contract.WatchLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodManagerStorageDenebForkTimestampUpdated) - if err := _EigenPodManagerStorage.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDenebForkTimestampUpdated is a log parse operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_EigenPodManagerStorage *EigenPodManagerStorageFilterer) ParseDenebForkTimestampUpdated(log types.Log) (*EigenPodManagerStorageDenebForkTimestampUpdated, error) { - event := new(EigenPodManagerStorageDenebForkTimestampUpdated) - if err := _EigenPodManagerStorage.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // EigenPodManagerStoragePausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the EigenPodManagerStorage contract. type EigenPodManagerStoragePausedIterator struct { Event *EigenPodManagerStoragePaused // Event containing the contract specifics and raw log diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go index 23954ef0d..50fa6d5f4 100644 --- a/pkg/bindings/EigenPodStorage/binding.go +++ b/pkg/bindings/EigenPodStorage/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceContainerProof struct { + BalanceContainerRoot [32]byte + Proof []byte +} + // BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. type BeaconChainProofsBalanceProof struct { PubkeyHash [32]byte @@ -51,22 +57,22 @@ type BeaconChainProofsValidatorProof struct { // IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. type IEigenPodCheckpoint struct { BeaconBlockRoot [32]byte - PodBalanceGwei *big.Int - BalanceDeltasGwei *big.Int ProofsRemaining *big.Int + PodBalanceGwei uint64 + BalanceDeltasGwei *big.Int } // IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. type IEigenPodValidatorInfo struct { - ValidatorIndex uint64 - RestakedBalanceGwei uint64 - MostRecentBalanceUpdateTimestamp uint64 - Status uint8 + ValidatorIndex uint64 + RestakedBalanceGwei uint64 + LastCheckpointedAt uint64 + Status uint8 } // EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract. var EigenPodStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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}]", } // EigenPodStorageABI is the input ABI used to generate the binding from. @@ -246,9 +252,40 @@ func (_EigenPodStorage *EigenPodStorageCallerSession) ActiveValidatorCount() (*b return _EigenPodStorage.Contract.ActiveValidatorCount(&_EigenPodStorage.CallOpts) } +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error) { + var out []interface{} + err := _EigenPodStorage.contract.Call(opts, &out, "checkpointBalanceExitedGwei", arg0) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPodStorage *EigenPodStorageSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _EigenPodStorage.Contract.CheckpointBalanceExitedGwei(&_EigenPodStorage.CallOpts, arg0) +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_EigenPodStorage *EigenPodStorageCallerSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _EigenPodStorage.Contract.CheckpointBalanceExitedGwei(&_EigenPodStorage.CallOpts, arg0) +} + // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { var out []interface{} err := _EigenPodStorage.contract.Call(opts, &out, "currentCheckpoint") @@ -265,14 +302,14 @@ func (_EigenPodStorage *EigenPodStorageCaller) CurrentCheckpoint(opts *bind.Call // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPodStorage *EigenPodStorageSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _EigenPodStorage.Contract.CurrentCheckpoint(&_EigenPodStorage.CallOpts) } // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_EigenPodStorage *EigenPodStorageCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _EigenPodStorage.Contract.CurrentCheckpoint(&_EigenPodStorage.CallOpts) } @@ -401,37 +438,6 @@ func (_EigenPodStorage *EigenPodStorageCallerSession) LastCheckpointTimestamp() return _EigenPodStorage.Contract.LastCheckpointTimestamp(&_EigenPodStorage.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPodStorage *EigenPodStorageCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _EigenPodStorage.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPodStorage *EigenPodStorageSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPodStorage.Contract.MostRecentWithdrawalTimestamp(&_EigenPodStorage.CallOpts) -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_EigenPodStorage *EigenPodStorageCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _EigenPodStorage.Contract.MostRecentWithdrawalTimestamp(&_EigenPodStorage.CallOpts) -} - // PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. // // Solidity: function podOwner() view returns(address) @@ -618,27 +624,6 @@ func (_EigenPodStorage *EigenPodStorageCallerSession) WithdrawableRestakedExecut return _EigenPodStorage.Contract.WithdrawableRestakedExecutionLayerGwei(&_EigenPodStorage.CallOpts) } -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPodStorage *EigenPodStorageTransactor) ActivateRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { - return _EigenPodStorage.contract.Transact(opts, "activateRestaking") -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPodStorage *EigenPodStorageSession) ActivateRestaking() (*types.Transaction, error) { - return _EigenPodStorage.Contract.ActivateRestaking(&_EigenPodStorage.TransactOpts) -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_EigenPodStorage *EigenPodStorageTransactorSession) ActivateRestaking() (*types.Transaction, error) { - return _EigenPodStorage.Contract.ActivateRestaking(&_EigenPodStorage.TransactOpts) -} - // Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. // // Solidity: function initialize(address owner) returns() @@ -725,23 +710,23 @@ func (_EigenPodStorage *EigenPodStorageTransactorSession) StartCheckpoint(revert // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPodStorage *EigenPodStorageTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPodStorage.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.contract.Transact(opts, "verifyCheckpointProofs", balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPodStorage *EigenPodStorageSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_EigenPodStorage *EigenPodStorageTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_EigenPodStorage *EigenPodStorageTransactorSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _EigenPodStorage.Contract.VerifyCheckpointProofs(&_EigenPodStorage.TransactOpts, balanceContainerProof, proofs) } // VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index f113b5885..7b2d04c6c 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220dbf9d2acf081cb52d4e46dbae1d726b585fac1ca6cac3f6af9b067c1f3d0b5d364736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201ef0c8b20a2f3a48c65fb61e13deb07a5ed944e1aa4985de15e63066e60496d464736f6c634300080c0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go index e4c5eb03c..e167c19f7 100644 --- a/pkg/bindings/IEigenPod/binding.go +++ b/pkg/bindings/IEigenPod/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// BeaconChainProofsBalanceContainerProof is an auto generated low-level Go binding around an user-defined struct. +type BeaconChainProofsBalanceContainerProof struct { + BalanceContainerRoot [32]byte + Proof []byte +} + // BeaconChainProofsBalanceProof is an auto generated low-level Go binding around an user-defined struct. type BeaconChainProofsBalanceProof struct { PubkeyHash [32]byte @@ -51,22 +57,22 @@ type BeaconChainProofsValidatorProof struct { // IEigenPodCheckpoint is an auto generated low-level Go binding around an user-defined struct. type IEigenPodCheckpoint struct { BeaconBlockRoot [32]byte - PodBalanceGwei *big.Int - BalanceDeltasGwei *big.Int ProofsRemaining *big.Int + PodBalanceGwei uint64 + BalanceDeltasGwei *big.Int } // IEigenPodValidatorInfo is an auto generated low-level Go binding around an user-defined struct. type IEigenPodValidatorInfo struct { - ValidatorIndex uint64 - RestakedBalanceGwei uint64 - MostRecentBalanceUpdateTimestamp uint64 - Status uint8 + ValidatorIndex uint64 + RestakedBalanceGwei uint64 + LastCheckpointedAt uint64 + Status uint8 } // IEigenPodMetaData contains all meta data concerning the IEigenPod contract. var IEigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int256\",\"internalType\":\"int256\"},{\"name\":\"proofsRemaining\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"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\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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}]", } // IEigenPodABI is the input ABI used to generate the binding from. @@ -246,9 +252,40 @@ func (_IEigenPod *IEigenPodCallerSession) ActiveValidatorCount() (*big.Int, erro return _IEigenPod.Contract.ActiveValidatorCount(&_IEigenPod.CallOpts) } +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_IEigenPod *IEigenPodCaller) CheckpointBalanceExitedGwei(opts *bind.CallOpts, arg0 uint64) (uint64, error) { + var out []interface{} + err := _IEigenPod.contract.Call(opts, &out, "checkpointBalanceExitedGwei", arg0) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_IEigenPod *IEigenPodSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _IEigenPod.Contract.CheckpointBalanceExitedGwei(&_IEigenPod.CallOpts, arg0) +} + +// CheckpointBalanceExitedGwei is a free data retrieval call binding the contract method 0x52396a59. +// +// Solidity: function checkpointBalanceExitedGwei(uint64 ) view returns(uint64) +func (_IEigenPod *IEigenPodCallerSession) CheckpointBalanceExitedGwei(arg0 uint64) (uint64, error) { + return _IEigenPod.Contract.CheckpointBalanceExitedGwei(&_IEigenPod.CallOpts, arg0) +} + // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_IEigenPod *IEigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEigenPodCheckpoint, error) { var out []interface{} err := _IEigenPod.contract.Call(opts, &out, "currentCheckpoint") @@ -265,14 +302,14 @@ func (_IEigenPod *IEigenPodCaller) CurrentCheckpoint(opts *bind.CallOpts) (IEige // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_IEigenPod *IEigenPodSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _IEigenPod.Contract.CurrentCheckpoint(&_IEigenPod.CallOpts) } // CurrentCheckpoint is a free data retrieval call binding the contract method 0x47d28372. // -// Solidity: function currentCheckpoint() view returns((bytes32,uint256,int256,uint256)) +// Solidity: function currentCheckpoint() view returns((bytes32,uint24,uint64,int128)) func (_IEigenPod *IEigenPodCallerSession) CurrentCheckpoint() (IEigenPodCheckpoint, error) { return _IEigenPod.Contract.CurrentCheckpoint(&_IEigenPod.CallOpts) } @@ -401,37 +438,6 @@ func (_IEigenPod *IEigenPodCallerSession) LastCheckpointTimestamp() (uint64, err return _IEigenPod.Contract.LastCheckpointTimestamp(&_IEigenPod.CallOpts) } -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodCaller) MostRecentWithdrawalTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "mostRecentWithdrawalTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) -} - -// MostRecentWithdrawalTimestamp is a free data retrieval call binding the contract method 0x87e0d289. -// -// Solidity: function mostRecentWithdrawalTimestamp() view returns(uint64) -func (_IEigenPod *IEigenPodCallerSession) MostRecentWithdrawalTimestamp() (uint64, error) { - return _IEigenPod.Contract.MostRecentWithdrawalTimestamp(&_IEigenPod.CallOpts) -} - // PodOwner is a free data retrieval call binding the contract method 0x0b18ff66. // // Solidity: function podOwner() view returns(address) @@ -618,27 +624,6 @@ func (_IEigenPod *IEigenPodCallerSession) WithdrawableRestakedExecutionLayerGwei return _IEigenPod.Contract.WithdrawableRestakedExecutionLayerGwei(&_IEigenPod.CallOpts) } -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_IEigenPod *IEigenPodTransactor) ActivateRestaking(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "activateRestaking") -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_IEigenPod *IEigenPodSession) ActivateRestaking() (*types.Transaction, error) { - return _IEigenPod.Contract.ActivateRestaking(&_IEigenPod.TransactOpts) -} - -// ActivateRestaking is a paid mutator transaction binding the contract method 0x0cd4649e. -// -// Solidity: function activateRestaking() returns() -func (_IEigenPod *IEigenPodTransactorSession) ActivateRestaking() (*types.Transaction, error) { - return _IEigenPod.Contract.ActivateRestaking(&_IEigenPod.TransactOpts) -} - // Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. // // Solidity: function initialize(address owner) returns() @@ -725,23 +710,23 @@ func (_IEigenPod *IEigenPodTransactorSession) StartCheckpoint(revertIfNoBalance // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_IEigenPod *IEigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _IEigenPod.contract.Transact(opts, "verifyCheckpointProofs", stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodTransactor) VerifyCheckpointProofs(opts *bind.TransactOpts, balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.contract.Transact(opts, "verifyCheckpointProofs", balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_IEigenPod *IEigenPodSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, balanceContainerProof, proofs) } // VerifyCheckpointProofs is a paid mutator transaction binding the contract method 0xf074ba62. // -// Solidity: function verifyCheckpointProofs((bytes32,bytes) stateRootProof, (bytes32,bytes32,bytes)[] proofs) returns() -func (_IEigenPod *IEigenPodTransactorSession) VerifyCheckpointProofs(stateRootProof BeaconChainProofsStateRootProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { - return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, stateRootProof, proofs) +// Solidity: function verifyCheckpointProofs((bytes32,bytes) balanceContainerProof, (bytes32,bytes32,bytes)[] proofs) returns() +func (_IEigenPod *IEigenPodTransactorSession) VerifyCheckpointProofs(balanceContainerProof BeaconChainProofsBalanceContainerProof, proofs []BeaconChainProofsBalanceProof) (*types.Transaction, error) { + return _IEigenPod.Contract.VerifyCheckpointProofs(&_IEigenPod.TransactOpts, balanceContainerProof, proofs) } // VerifyStaleBalance is a paid mutator transaction binding the contract method 0x039157d2. diff --git a/pkg/bindings/IEigenPodManager/binding.go b/pkg/bindings/IEigenPodManager/binding.go index a2b9e41b6..e7977b39b 100644 --- a/pkg/bindings/IEigenPodManager/binding.go +++ b/pkg/bindings/IEigenPodManager/binding.go @@ -31,7 +31,7 @@ var ( // IEigenPodManagerMetaData contains all meta data concerning the IEigenPodManager contract. var IEigenPodManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", } // IEigenPodManagerABI is the input ABI used to generate the binding from. @@ -211,37 +211,6 @@ func (_IEigenPodManager *IEigenPodManagerCallerSession) BeaconChainETHStrategy() return _IEigenPodManager.Contract.BeaconChainETHStrategy(&_IEigenPodManager.CallOpts) } -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_IEigenPodManager *IEigenPodManagerCaller) DenebForkTimestamp(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _IEigenPodManager.contract.Call(opts, &out, "denebForkTimestamp") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_IEigenPodManager *IEigenPodManagerSession) DenebForkTimestamp() (uint64, error) { - return _IEigenPodManager.Contract.DenebForkTimestamp(&_IEigenPodManager.CallOpts) -} - -// DenebForkTimestamp is a free data retrieval call binding the contract method 0x44e71c80. -// -// Solidity: function denebForkTimestamp() view returns(uint64) -func (_IEigenPodManager *IEigenPodManagerCallerSession) DenebForkTimestamp() (uint64, error) { - return _IEigenPodManager.Contract.DenebForkTimestamp(&_IEigenPodManager.CallOpts) -} - // EigenPodBeacon is a free data retrieval call binding the contract method 0x292b7b2b. // // Solidity: function eigenPodBeacon() view returns(address) @@ -740,27 +709,6 @@ func (_IEigenPodManager *IEigenPodManagerTransactorSession) RemoveShares(podOwne return _IEigenPodManager.Contract.RemoveShares(&_IEigenPodManager.TransactOpts, podOwner, shares) } -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_IEigenPodManager *IEigenPodManagerTransactor) SetDenebForkTimestamp(opts *bind.TransactOpts, newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _IEigenPodManager.contract.Transact(opts, "setDenebForkTimestamp", newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_IEigenPodManager *IEigenPodManagerSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _IEigenPodManager.Contract.SetDenebForkTimestamp(&_IEigenPodManager.TransactOpts, newDenebForkTimestamp) -} - -// SetDenebForkTimestamp is a paid mutator transaction binding the contract method 0x463db038. -// -// Solidity: function setDenebForkTimestamp(uint64 newDenebForkTimestamp) returns() -func (_IEigenPodManager *IEigenPodManagerTransactorSession) SetDenebForkTimestamp(newDenebForkTimestamp uint64) (*types.Transaction, error) { - return _IEigenPodManager.Contract.SetDenebForkTimestamp(&_IEigenPodManager.TransactOpts, newDenebForkTimestamp) -} - // SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. // // Solidity: function setPauserRegistry(address newPauserRegistry) returns() @@ -1139,284 +1087,6 @@ func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBeaconChainETHWithdrawal return event, nil } -// IEigenPodManagerBeaconOracleUpdatedIterator is returned from FilterBeaconOracleUpdated and is used to iterate over the raw logs and unpacked data for BeaconOracleUpdated events raised by the IEigenPodManager contract. -type IEigenPodManagerBeaconOracleUpdatedIterator struct { - Event *IEigenPodManagerBeaconOracleUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IEigenPodManagerBeaconOracleUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IEigenPodManagerBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IEigenPodManagerBeaconOracleUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodManagerBeaconOracleUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IEigenPodManagerBeaconOracleUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IEigenPodManagerBeaconOracleUpdated represents a BeaconOracleUpdated event raised by the IEigenPodManager contract. -type IEigenPodManagerBeaconOracleUpdated struct { - NewOracleAddress common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterBeaconOracleUpdated is a free log retrieval operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_IEigenPodManager *IEigenPodManagerFilterer) FilterBeaconOracleUpdated(opts *bind.FilterOpts, newOracleAddress []common.Address) (*IEigenPodManagerBeaconOracleUpdatedIterator, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _IEigenPodManager.contract.FilterLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return &IEigenPodManagerBeaconOracleUpdatedIterator{contract: _IEigenPodManager.contract, event: "BeaconOracleUpdated", logs: logs, sub: sub}, nil -} - -// WatchBeaconOracleUpdated is a free log subscription operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_IEigenPodManager *IEigenPodManagerFilterer) WatchBeaconOracleUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerBeaconOracleUpdated, newOracleAddress []common.Address) (event.Subscription, error) { - - var newOracleAddressRule []interface{} - for _, newOracleAddressItem := range newOracleAddress { - newOracleAddressRule = append(newOracleAddressRule, newOracleAddressItem) - } - - logs, sub, err := _IEigenPodManager.contract.WatchLogs(opts, "BeaconOracleUpdated", newOracleAddressRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IEigenPodManagerBeaconOracleUpdated) - if err := _IEigenPodManager.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseBeaconOracleUpdated is a log parse operation binding the contract event 0x08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f6. -// -// Solidity: event BeaconOracleUpdated(address indexed newOracleAddress) -func (_IEigenPodManager *IEigenPodManagerFilterer) ParseBeaconOracleUpdated(log types.Log) (*IEigenPodManagerBeaconOracleUpdated, error) { - event := new(IEigenPodManagerBeaconOracleUpdated) - if err := _IEigenPodManager.contract.UnpackLog(event, "BeaconOracleUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// IEigenPodManagerDenebForkTimestampUpdatedIterator is returned from FilterDenebForkTimestampUpdated and is used to iterate over the raw logs and unpacked data for DenebForkTimestampUpdated events raised by the IEigenPodManager contract. -type IEigenPodManagerDenebForkTimestampUpdatedIterator struct { - Event *IEigenPodManagerDenebForkTimestampUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IEigenPodManagerDenebForkTimestampUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IEigenPodManagerDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IEigenPodManagerDenebForkTimestampUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodManagerDenebForkTimestampUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IEigenPodManagerDenebForkTimestampUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IEigenPodManagerDenebForkTimestampUpdated represents a DenebForkTimestampUpdated event raised by the IEigenPodManager contract. -type IEigenPodManagerDenebForkTimestampUpdated struct { - NewValue uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDenebForkTimestampUpdated is a free log retrieval operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_IEigenPodManager *IEigenPodManagerFilterer) FilterDenebForkTimestampUpdated(opts *bind.FilterOpts) (*IEigenPodManagerDenebForkTimestampUpdatedIterator, error) { - - logs, sub, err := _IEigenPodManager.contract.FilterLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return &IEigenPodManagerDenebForkTimestampUpdatedIterator{contract: _IEigenPodManager.contract, event: "DenebForkTimestampUpdated", logs: logs, sub: sub}, nil -} - -// WatchDenebForkTimestampUpdated is a free log subscription operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_IEigenPodManager *IEigenPodManagerFilterer) WatchDenebForkTimestampUpdated(opts *bind.WatchOpts, sink chan<- *IEigenPodManagerDenebForkTimestampUpdated) (event.Subscription, error) { - - logs, sub, err := _IEigenPodManager.contract.WatchLogs(opts, "DenebForkTimestampUpdated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IEigenPodManagerDenebForkTimestampUpdated) - if err := _IEigenPodManager.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDenebForkTimestampUpdated is a log parse operation binding the contract event 0x19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db. -// -// Solidity: event DenebForkTimestampUpdated(uint64 newValue) -func (_IEigenPodManager *IEigenPodManagerFilterer) ParseDenebForkTimestampUpdated(log types.Log) (*IEigenPodManagerDenebForkTimestampUpdated, error) { - event := new(IEigenPodManagerDenebForkTimestampUpdated) - if err := _IEigenPodManager.contract.UnpackLog(event, "DenebForkTimestampUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // IEigenPodManagerPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the IEigenPodManager contract. type IEigenPodManagerPausedIterator struct { Event *IEigenPodManagerPaused // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index a2f204bba..e8c724019 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212204de0cd662d4e6add8e32c7f6cc0e78dd41e2a83aedbb97d6d65eb6f376a3805764736f6c634300080c0033", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212202a5b3d938225078efdada0b9d71e3deeea4719e5d4c7cd1e0d2aa8b50635717e64736f6c634300080c0033", } // RewardsCoordinatorABI 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 6f5afb2a1..14d8291cd 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200b2d1bf2882b0da8db5f597f065ececc94ce995a673448b41e103ac2f6019bc064736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220b4694f0c37ad1fee59690c31bf2b0897379fc3409dbf92cc28eba62bfedb0f5e64736f6c634300080c0033", } // 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 aa585756f..0c1e9f2e6 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212200df93bb52333124fa856fc8d410b8eb351ddf7fef3390a242c22221a8da36be464736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220cf064cee51ffe744f589fb58d0cf8307f7349092672e7e45862555af0421ebcf64736f6c634300080c0033", } // StrategyBaseTVLLimitsABI 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 b718b5e5e..2eb0c81d0 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea26469706673582212207c20b61435ee67af08f5918d6b67a437de601ceee7a7259d0ad5f0709aa618c364736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea264697066735822122040c597deb658b4ead487d296bdbb35f977e07e3422fdc136e9eed8c93dd25a4164736f6c634300080c0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 3aa158e95..3b1abbaac 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -88,7 +88,7 @@ abstract contract IntegrationBase is IntegrationDeployer { } else { string memory operatorName = string.concat("Operator", numOperators.toString()); - (operator, strategies, tokenBalances) = _randUser(operatorName); + (operator, strategies, tokenBalances) = _randUser_NoETH(operatorName); uint[] memory addedShares = _calculateExpectedShares(strategies, tokenBalances); @@ -104,6 +104,22 @@ abstract contract IntegrationBase is IntegrationDeployer { return (operator, strategies, tokenBalances); } + /// @dev Send a random amount of ETH (up to 10 gwei) to the destination via `call`, + /// triggering its fallback function. Sends a gwei-divisible amount as well as a + /// non-gwei-divisible amount. + /// + /// Total sent == `gweiSent + remainderSent` + function _sendRandomETH(address destination) internal returns (uint64 gweiSent, uint remainderSent) { + gweiSent = uint64(_randUint({ min: 1 , max: 10 })); + remainderSent = _randUint({ min: 1, max: 100 }); + uint totalSent = (gweiSent * GWEI_TO_WEI) + remainderSent; + + cheats.deal(address(this), address(this).balance + totalSent); + destination.call{ value: totalSent }(""); + + return (gweiSent, remainderSent); + } + /// @dev If we're on mainnet, upgrade contracts to M2 and migrate stakers/operators function _upgradeEigenLayerContracts() internal { if (forkType == MAINNET) { @@ -146,6 +162,26 @@ 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 }); + + 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) { + result[newLen] = validators[i]; + newLen++; + } + } + + // Manually update length of result + assembly { mstore(result, newLen) } + + return result; + } + /******************************************************************************* COMMON ASSERTIONS *******************************************************************************/ @@ -268,6 +304,15 @@ abstract contract IntegrationBase is IntegrationDeployer { assertEq(withdrawalRoot, delegationManager.calculateWithdrawalRoot(withdrawal), err); } + function assert_PodBalance_Eq( + User staker, + uint expectedBalance, + string memory err + ) internal { + EigenPod pod = staker.pod(); + assertEq(address(pod).balance, expectedBalance, err); + } + function assert_ProofsRemainingEqualsActive( User staker, string memory err @@ -275,6 +320,15 @@ abstract contract IntegrationBase is IntegrationDeployer { EigenPod pod = staker.pod(); assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err); } + + function assert_CheckpointPodBalance( + User staker, + uint64 expectedPodBalanceGwei, + string memory err + ) internal { + EigenPod pod = staker.pod(); + assertEq(pod.currentCheckpoint().podBalanceGwei, expectedPodBalanceGwei, err); + } /******************************************************************************* SNAPSHOT ASSERTIONS diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index b0f6eb658..667a953ce 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -15,8 +15,9 @@ contract IntegrationCheckUtils is IntegrationBase { function check_VerifyWC_State( User staker, uint40[] memory validators, - uint beaconBalanceWei + uint64 beaconBalanceGwei ) internal { + uint beaconBalanceWei = beaconBalanceGwei * GWEI_TO_WEI; assert_Snap_Added_StakerShares(staker, BEACONCHAIN_ETH_STRAT, beaconBalanceWei, "staker should have added 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"); @@ -29,6 +30,15 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Created_Checkpoint(staker, "staker should have created a new checkpoint"); } + function check_StartCheckpoint_WithPodBalance_State( + User staker, + uint64 expectedPodBalanceGwei + ) internal { + check_StartCheckpoint_State(staker); + + assert_CheckpointPodBalance(staker, expectedPodBalanceGwei, "checkpoint podBalanceGwei should equal expected"); + } + function check_EmptyCheckpoint_State( User staker ) internal { @@ -43,13 +53,33 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Added_PodBalanceToWithdrawable(staker, "pod balance should have been added to withdrawable restaked exec layer gwei"); } + function check_CompleteCheckpoint_EarnOnBeacon_State( + User staker, + uint64 beaconBalanceAdded + ) internal { + check_CompleteCheckpoint_State(staker); + + uint balanceAddedWei = beaconBalanceAdded * GWEI_TO_WEI; + assert_Snap_Added_StakerShares(staker, BEACONCHAIN_ETH_STRAT, balanceAddedWei, "should have increased shares by excess beacon balance"); + } + + function check_CompleteCheckpoint_WithPodBalance_State( + User staker, + uint64 expectedPodBalanceGwei + ) internal { + check_CompleteCheckpoint_State(staker); + + assert_Snap_Added_WithdrawableGwei(staker, expectedPodBalanceGwei, "should have added expected gwei to withdrawable restaked exec layer gwei"); + } + function check_CompleteCheckpoint_WithExits_State( User staker, uint40[] memory exitedValidators, uint64 exitedBalanceGwei ) internal { - check_CompleteCheckpoint_State(staker); - assert_Snap_Added_WithdrawableGwei(staker, exitedBalanceGwei, "should have added expected gwei to withdrawable restaked exec layer gwei"); + check_CompleteCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei); + + // TODO check share delta 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"); diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 7c429aa7d..b6cca32d7 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -842,8 +842,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { tokenBalances = new uint[](1); // Award the user with a random amount of ETH - // This guarantees at least 1 ETH, and at most (32 * 20) ETH - uint amount = 1 ether * _randUint({ min: 1, max: 640 }); + // This guarantees a multiple of 32 ETH (at least 1, up to/incl 5) + uint amount = 32 ether * _randUint({ min: 1, max: 5 }); cheats.deal(address(user), amount); strategies[0] = BEACONCHAIN_ETH_STRAT; @@ -865,8 +865,8 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { } // Award the user with a random amount of ETH - // This guarantees at least 1 ETH, and at most (32 * 20) ETH - uint amount = 1 ether * _randUint({ min: 1, max: 640 }); + // This guarantees a multiple of 32 ETH (at least 1, up to/incl 5) + uint amount = 32 ether * _randUint({ min: 1, max: 5 }); cheats.deal(address(user), amount); // Add BEACONCHAIN_ETH_STRAT and eth balance diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index b209f6cf3..3600fcab9 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -47,7 +47,6 @@ contract BeaconChainMock is PrintUtils { } /// @dev All withdrawals are processed with index == 0 - uint64 constant WITHDRAWAL_INDEX = 0; uint constant GWEI_TO_WEI = 1e9; uint constant ZERO_NODES_LENGTH = 100; @@ -889,7 +888,7 @@ contract BeaconChainMock is PrintUtils { for (uint i = 0; i < _validators.length; i++) { require( _validators[i] <= lastIndexProcessed, - "BeaconChain.getCredentialProofs: no credential proof found (did you call advanceEpoch yet?)" + "BeaconChain.getCredentialProofs: validator has not been included in beacon chain state (DID YOU CALL advanceEpoch YET?)" ); } @@ -910,19 +909,19 @@ contract BeaconChainMock is PrintUtils { return proofs; } - function getCheckpointProofs(uint40[] memory _validators) public view returns (CheckpointProofs memory) { + function getCheckpointProofs(uint40[] memory _validators, uint64 timestamp) public view returns (CheckpointProofs memory) { // If we have not advanced an epoch since a validator was created, no proofs have been // generated for that validator. We check this here and revert early so we don't return // empty proofs. for (uint i = 0; i < _validators.length; i++) { require( _validators[i] <= lastIndexProcessed, - "BeaconChain.getCredentialProofs: no credential proof found (did you call advanceEpoch yet?)" + "BeaconChain.getCredentialProofs: no checkpoint proof found (did you call advanceEpoch yet?)" ); } CheckpointProofs memory proofs = CheckpointProofs({ - balanceContainerProof: balanceContainerProofs[curTimestamp], + balanceContainerProof: balanceContainerProofs[timestamp], balanceProofs: new BeaconChainProofs.BalanceProof[](_validators.length) }); @@ -930,7 +929,7 @@ contract BeaconChainMock is PrintUtils { for (uint i = 0; i < _validators.length; i++) { uint40 validatorIndex = _validators[i]; uint40 balanceRootIndex = _getBalanceRootIndex(validatorIndex); - BalanceRootProof memory proof = balanceRootProofs[curTimestamp][balanceRootIndex]; + BalanceRootProof memory proof = balanceRootProofs[timestamp][balanceRootIndex]; proofs.balanceProofs[i] = BeaconChainProofs.BalanceProof({ pubkeyHash: validators[validatorIndex].pubkeyHash, 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 d5293d7f1..af4425232 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -21,6 +21,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { cheats.pauseGasMetering(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); EigenPod pod = staker.pod(); CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); @@ -50,7 +51,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { staker.startCheckpoint(); // check_StartCheckpoint_State(staker); - CheckpointProofs memory cpProofs = beaconChain.getCheckpointProofs(validators); + CheckpointProofs memory cpProofs = beaconChain.getCheckpointProofs(validators, pod.currentCheckpointTimestamp()); cheats.resumeGasMetering(); startGas = gasleft(); @@ -68,22 +69,79 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { } /******************************************************************************* - VERIFY -> START/COMPLETE CHECKPOINT + VERIFY -> START -> COMPLETE CHECKPOINT + (TIMING VARIANTS) *******************************************************************************/ - /// 1. Verify one or more validators' withdrawal credentials + /// 1. Verify validators' withdrawal credentials /// 2. start a checkpoint /// 3. complete a checkpoint - /// => no change in shares + /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); - uint40[] memory subset = _choose(validators); - uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); - staker.verifyWithdrawalCredentials(subset); - check_VerifyWC_State(staker, subset, subsetBalanceWei); + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + } + + /// 1. Verify validators' withdrawal credentials + /// 2. Verify validators' withdrawal credentials again + /// => This should fail + function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + cheats.expectRevert("EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials"); + staker.verifyWithdrawalCredentials(validators); + } + + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// 3. start a checkpoint again + /// => This should fail + function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + cheats.expectRevert("EigenPod._startCheckpoint: must finish previous checkpoint before starting another"); + staker.startCheckpoint(); + } + + /// 1. Verify validators' withdrawal credentials + /// -- move forward 1 or more epochs + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); // Advance epoch without generating consensus rewards beaconChain.advanceEpoch_NoRewards(); @@ -95,189 +153,359 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { check_CompleteCheckpoint_State(staker); } - /// 1. Verify one or more validators' withdrawal credentials - /// 2. start a checkpoint (in the same block) + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- move forward 1 or more epochs /// 3. complete a checkpoint - /// => no change in shares - function test_VerifyWC_SameBlock_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + /// => no change in shares between 1 and 3 + function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); - uint40[] memory subset = _choose(validators); - uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); - staker.verifyWithdrawalCredentials(subset); - check_VerifyWC_State(staker, subset, subsetBalanceWei); + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); staker.startCheckpoint(); check_StartCheckpoint_State(staker); + // Advance epoch without generating consensus rewards + beaconChain.advanceEpoch_NoRewards(); + staker.completeCheckpoint(); check_CompleteCheckpoint_State(staker); } - /// 1. Verify one or more validators' withdrawal credentials - /// -- fully exit one or more validators to the pod + /******************************************************************************* + VERIFY -> START -> COMPLETE CHECKPOINT + (EXIT TO POD VARIANTS) + *******************************************************************************/ + + /// -- 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, ) = staker.startValidators(); + staker.exitValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + cheats.expectRevert("EigenPod._verifyWithdrawalCredentials: validator must not be exiting"); + staker.verifyWithdrawalCredentials(validators); + } + + /// 1. Verify validators' withdrawal credentials + /// -- fully exit validators to pod /// 2. start a checkpoint /// 3. complete a checkpoint - /// => no change in shares + /// => no change in shares between 1 and 3 function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + // Fully exit one or more validators and advance epoch without generating rewards uint40[] memory subset = _choose(validators); - uint subsetBalanceWei = beaconChain.totalEffectiveBalanceWei(subset); + uint64 exitedBalanceGwei = staker.exitValidators(subset); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + check_StartCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei); - staker.verifyWithdrawalCredentials(subset); - check_VerifyWC_State(staker, subset, subsetBalanceWei); + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithExits_State(staker, subset, exitedBalanceGwei); + } - // Fully exit validators to pod and advance epoch without generating consensus rewards - staker.exitValidators(subset); + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- fully exit validators to pod + /// 3. complete a checkpoint + /// => no change in shares between 1 and 3 + function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + staker.startCheckpoint(); check_StartCheckpoint_State(staker); + // Fully exit one or more validators and advance epoch without generating rewards + uint40[] memory subset = _choose(validators); + uint64 exitedBalanceGwei = staker.exitValidators(subset); + beaconChain.advanceEpoch_NoRewards(); + staker.completeCheckpoint(); check_CompleteCheckpoint_State(staker); } - /// 1. Verify one or more validators' withdrawal credentials + /******************************************************************************* + VERIFY -> START -> COMPLETE CHECKPOINT + (SLASH TO POD VARIANTS) + *******************************************************************************/ + + // TODO + + /******************************************************************************* + VERIFY -> START -> COMPLETE CHECKPOINT + (EARN ON CL VARIANTS) + *******************************************************************************/ + /// -- earn rewards on beacon chain (not withdrawn to pod) + /// 1. Verify validators' withdrawal credentials /// 2. start a checkpoint /// 3. complete a checkpoint - /// => shares increase by rewards earned - function test_VerifyWC_Earn_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + /// => after 3, shares increase by rewards earned on beacon chain + function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch and generate consensus rewards, but don't withdraw to pod + beaconChain.advanceEpoch_NoWithdraw(); + uint64 beaconBalanceIncreaseGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_EarnOnBeacon_State(staker, beaconBalanceIncreaseGwei); } - /// 1. Verify one or more validators' withdrawal credentials + /// 1. Verify validators' withdrawal credentials /// -- earn rewards on beacon chain (not withdrawn to pod) /// 2. start a checkpoint /// 3. complete a checkpoint - /// => shares increase by rewards earned - function test_VerifyWC_Earn_Withdraw_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + /// => after 3, shares increase by rewards earned on beacon chain + function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + // Advance epoch and generate consensus rewards, but don't withdraw to pod + beaconChain.advanceEpoch_NoWithdraw(); + uint64 beaconBalanceIncreaseGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_EarnOnBeacon_State(staker, beaconBalanceIncreaseGwei); } - function test_VerifyAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public r(_rand) { + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + // Advance epoch and generate consensus rewards, but don't withdraw to pod + beaconChain.advanceEpoch_NoWithdraw(); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_EarnOnBeacon_State(staker, 0); + } + + /******************************************************************************* + VERIFY -> START -> COMPLETE CHECKPOINT + (EARN TO POD VARIANTS) + *******************************************************************************/ + + /// -- earn rewards on beacon chain (withdrawn to pod) + /// 1. Verify validators' withdrawal credentials + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH beaconChain.advanceEpoch(); - // check pod balances have increased + uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); + check_CompleteCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei); } - function test_VerifyAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public r(_rand) { + /// 1. Verify validators' withdrawal credentials + /// -- earn rewards on beacon chain (withdrawn to pod) + /// 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); - beaconChain.advanceEpoch_NoWithdraw(); - // check pod balances have increased + // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH + beaconChain.advanceEpoch(); + uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); + check_CompleteCheckpoint_WithPodBalance_State(staker, expectedWithdrawnGwei); } - function test_VerifyAll_Start_CompleteCP_NoRewards(uint24 _rand) public r(_rand) { + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); beaconChain.advanceEpoch_NoRewards(); - // check pod balances have increased staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, 0); + + // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH + beaconChain.advanceEpoch(); + uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); staker.completeCheckpoint(); check_CompleteCheckpoint_State(staker); + // check that `completeCheckpoint` added nothing to `withdrawableRestakedExecutionLayerGwei` + assert_Snap_Added_WithdrawableGwei(staker, 0, "withdrawable restaked gwei should not have increased"); + // `pod.balance == gweiSent + remainderSent + assert_PodBalance_Eq(staker, (expectedWithdrawnGwei * GWEI_TO_WEI), "pod balance should equal expected"); } /******************************************************************************* - VERIFY -> EXIT -> START/COMPLETE CHECKPOINT + VERIFY -> START -> COMPLETE CHECKPOINT + (NATIVE ETH VARIANTS) *******************************************************************************/ - function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsWithdrawn(uint24 _rand) public r(_rand) { + /// -- Pod receives native ETH via fallback + /// 1. Verify validators' withdrawal credentials + /// 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); - staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); + // Send a random amount of ETH to staker's fallback + (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); - uint64 exitedBalanceGwei = staker.exitValidators(validators); - beaconChain.advanceEpoch(); - // check pod balances have increased + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + // should behave identically to partial withdrawals captured by the "earn to pod" variants staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, gweiSent); staker.completeCheckpoint(); - check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); + check_CompleteCheckpoint_State(staker); + // check that `completeCheckpoint` added `gweiSent` to `withdrawableRestakedExecutionLayerGwei` + assert_Snap_Added_WithdrawableGwei(staker, gweiSent, "withdrawable restaked gwei should have increased by expected"); + // check that `pod.balance == withdrawableRestakedExecutionLayerGwei + remainderSent + assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); } - function test_VerifyAll_ExitAll_Start_CompleteCP_WithRewardsNotWithdrawn(uint24 _rand) public r(_rand) { + /// 1. Verify validators' withdrawal credentials + /// -- Pod receives native ETH via fallback + /// 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); - uint64 exitedBalanceGwei = staker.exitValidators(validators); - beaconChain.advanceEpoch_NoWithdraw(); - // check pod balances have increased + // Send a random amount of ETH to staker's fallback + (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); + // should behave identically to partial withdrawals captured by the "earn to pod" variants staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, gweiSent); staker.completeCheckpoint(); - check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); + check_CompleteCheckpoint_State(staker); + // check that `completeCheckpoint` added `gweiSent` to `withdrawableRestakedExecutionLayerGwei` + assert_Snap_Added_WithdrawableGwei(staker, gweiSent, "withdrawable restaked gwei should have increased by expected"); + // check that `pod.balance == withdrawableRestakedExecutionLayerGwei + remainderSent + assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); } - function test_VerifyAll_ExitAll_Start_CompleteCP_NoRewards(uint24 _rand) public r(_rand) { + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- 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) { (User staker, ,) = _newRandomStaker(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); staker.verifyWithdrawalCredentials(validators); - check_VerifyWC_State(staker, validators, beaconBalanceWei); - - uint64 exitedBalanceGwei = staker.exitValidators(validators); - beaconChain.advanceEpoch_NoRewards(); - // check pod balances have increased + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + // should behave identically to partial withdrawals captured by the "earn to pod" variants + // ... if we didn't have any partial withdrawals! staker.startCheckpoint(); - check_StartCheckpoint_State(staker); + check_StartCheckpoint_WithPodBalance_State(staker, 0); - staker.completeCheckpoint(); - check_CompleteCheckpoint_WithExits_State(staker, validators, exitedBalanceGwei); - } + // Send a random amount of ETH to staker's fallback + (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); - /// @dev Choose a random subset of validators - /// TODO implement - function _choose(uint40[] memory validators) internal returns (uint40[] memory) { - return validators; + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + // check that `completeCheckpoint` added nothing to `withdrawableRestakedExecutionLayerGwei` + assert_Snap_Added_WithdrawableGwei(staker, 0, "withdrawable restaked gwei should not have increased"); + // `pod.balance == gweiSent + remainderSent + assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); } } \ 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 f7b5b8291..203d3a9ad 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -207,7 +207,7 @@ contract User is PrintUtils { /// Note: If the user does not have enough ETH to start a validator, this method reverts /// Note: This method also advances one epoch forward on the beacon chain, so that /// withdrawal credential proofs are generated for each validator. - function startValidators() public createSnapshot virtual returns (uint40[] memory, uint) { + function startValidators() public createSnapshot virtual returns (uint40[] memory, uint64) { _logM("startValidators"); return _startValidators(); @@ -257,6 +257,8 @@ contract User is PrintUtils { if (strat == BEACONCHAIN_ETH_STRAT) { (uint40[] memory newValidators, ) = _startValidators(); + // Advance forward one epoch and generate credential and balance proofs for each validator + beaconChain.advanceEpoch_NoRewards(); _verifyWithdrawalCredentials(newValidators); } else { IERC20 underlyingToken = strat.underlyingToken(); @@ -339,7 +341,7 @@ contract User is PrintUtils { /// Note: If the user does not have enough ETH to start a validator, this method reverts /// Note: This method also advances one epoch forward on the beacon chain, so that /// withdrawal credential proofs are generated for each validator. - function _startValidators() internal returns (uint40[] memory, uint) { + function _startValidators() internal returns (uint40[] memory, uint64) { uint balanceWei = address(this).balance; // Number of full validators: balance / 32 ETH @@ -359,10 +361,10 @@ contract User is PrintUtils { require(totalValidators != 0, "startValidators: not enough ETH to start a validator"); uint40[] memory newValidators = new uint40[](totalValidators); - uint totalBeaconBalance = address(this).balance - balanceWei; + uint64 totalBeaconBalanceGwei = uint64((address(this).balance - balanceWei) / GWEI_TO_WEI); _log("- creating new validators", newValidators.length); - _log("- depositing balance to beacon chain (wei)", totalBeaconBalance); + _log("- depositing balance to beacon chain (gwei)", totalBeaconBalanceGwei); // Create each of the full validators for (uint i = 0; i < numValidators; i++) { @@ -384,10 +386,7 @@ contract User is PrintUtils { validators.push(validatorIndex); } - // Advance forward one epoch and generate withdrawal and balance proofs for each validator - beaconChain.advanceEpoch_NoRewards(); - - return (newValidators, totalBeaconBalance); + return (newValidators, totalBeaconBalanceGwei); } function _exitValidators(uint40[] memory _validators) internal returns (uint64 exitedBalanceGwei) { @@ -403,14 +402,21 @@ contract User is PrintUtils { } function _startCheckpoint() internal { - pod.startCheckpoint(false); + try pod.startCheckpoint(false) {} catch (bytes memory err) { + _revert(err); + } } function _completeCheckpoint() internal { _log("- active validator count", pod.activeValidatorCount()); _log("- proofs remaining", pod.currentCheckpoint().proofsRemaining); - CheckpointProofs memory proofs = beaconChain.getCheckpointProofs(validators); + uint64 checkpointTimestamp = pod.currentCheckpointTimestamp(); + if (checkpointTimestamp == 0) { + revert("User._completeCheckpoint: no existing checkpoint"); + } + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs(validators, checkpointTimestamp); _log("- submitting num checkpoint proofs", proofs.balanceProofs.length); pod.verifyCheckpointProofs({ @@ -422,13 +428,23 @@ contract User is PrintUtils { function _verifyWithdrawalCredentials(uint40[] memory _validators) internal { CredentialProofs memory proofs = beaconChain.getCredentialProofs(_validators); - pod.verifyWithdrawalCredentials({ + try pod.verifyWithdrawalCredentials({ beaconTimestamp: proofs.beaconTimestamp, stateRootProof: proofs.stateRootProof, validatorIndices: _validators, validatorFieldsProofs: proofs.validatorFieldsProofs, validatorFields: proofs.validatorFields - }); + }) { } catch (bytes memory err) { + _revert(err); + } + } + + /// @dev Revert, passing through an error message + function _revert(bytes memory err) internal { + if (err.length != 0) { + assembly { revert(add(32, err), mload(err)) } + } + revert("reverted with unknown error"); } function _podWithdrawalCredentials() internal view returns (bytes memory) { @@ -524,6 +540,8 @@ contract User_AltMethods is User { if (strat == BEACONCHAIN_ETH_STRAT) { (uint40[] memory newValidators, ) = _startValidators(); + // Advance forward one epoch and generate credential and balance proofs for each validator + beaconChain.advanceEpoch_NoRewards(); _verifyWithdrawalCredentials(newValidators); } else { // Approve token From 20189e406d91288fbe764f99b7a9e3500aed3a9d Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 14 Jun 2024 21:36:46 +0000 Subject: [PATCH 23/85] fix: add additional pause condition for verifyStaleBalance --- pkg/bindings/EigenPod/binding.go | 2 +- src/contracts/pods/EigenPod.sol | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index c85501271..2bc8456cb 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b506040516200492938038062004929833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147126200021760003960006105aa0152600081816102c8015281816105e5015281816109b701528181610cfe01528181610ebd01528181610fc201528181611262015281816116ae015281816118570152612f18015260008181610483015261108d01526147126000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613a5a565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b18565b610974565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613be6565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613c42565b610d68565b6040516101d99190613cbb565b34801561041957600080fd5b5061042d610428366004613cc9565b610dcd565b6040516101d99190613ce2565b34801561044657600080fd5b50610400610455366004613cc9565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613d38565b610e7a565b6101a36104d3366004613d55565b610fb7565b3480156104e457600080fd5b5061042d6104f3366004613c42565b611164565b34801561050457600080fd5b506101a3610513366004613de8565b611257565b34801561052457600080fd5b506101a3610533366004613e14565b611494565b34801561054457600080fd5b506101a3610553366004613f05565b61166b565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004613fd6565b61183e565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610658919061403e565b1561067e5760405162461bcd60e51b81526004016106759061405b565b60405180910390fd5b60006106c461068d84806140b8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bd292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561073357610733613c83565b600281111561074457610744613c83565b8152505090506212750081604001516001600160401b03166107669190614117565b866001600160401b0316116107e35760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156107fb576107fb613c83565b146108655760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b6108a961087285806140b8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bf692505050565b61092d5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b61093f61093987611c20565b86611dd6565b610962853561094e86806140b8565b61095b602089018961412f565b8651611f31565b61096c6000612148565b505050505050565b6033546001600160a01b0316331461099e5760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2a919061403e565b15610a475760405162461bcd60e51b81526004016106759061405b565b603454600160401b900460ff16610ac65760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610ad457508382145b610b645760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610b975750603a546001600160401b03600160401b9091048116908a16115b610c1e5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610c30610c2a8a611c20565b89611dd6565b6000805b87811015610cd457610cb68b8b358b8b85818110610c5457610c546141bd565b9050602002016020810190610c6991906141d3565b8a8a86818110610c7b57610c7b6141bd565b9050602002810190610c8d919061412f565b8a8a88818110610c9f57610c9f6141bd565b9050602002810190610cb191906140b8565b6123ca565b610cc09083614117565b915080610ccc816141fa565b915050610c34565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610d4457600080fd5b505af1158015610d58573d6000803e3d6000fd5b5050505050505050505050505050565b600080610daa84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610df56040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610e6057610e60613c83565b6002811115610e7157610e71613c83565b90525092915050565b6033546001600160a01b03163314610ea45760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f30919061403e565b15610f4d5760405162461bcd60e51b81526004016106759061405b565b610f5682612148565b603454600160401b900460ff16610fb3576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fff5760405162461bcd60e51b815260040161067590614215565b346801bc16d674ec8000001461108b5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876110ce612a12565b8888886040518863ffffffff1660e01b81526004016110f2969594939291906142eb565b6000604051808303818588803b15801561110b57600080fd5b505af115801561111f573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e23858560405161115592919061433a565b60405180910390a15050505050565b61118c6040805160808101825260008082526020820181905291810182905290606082015290565b603660006111cf85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061291892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561123c5761123c613c83565b600281111561124d5761124d613c83565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461129f5760405162461bcd60e51b815260040161067590614215565b6112ad633b9aca0082614364565b156113375760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b6000611347633b9aca0083614378565b6034549091506001600160401b0390811690821611156114005760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b6034805482919060009061141e9084906001600160401b031661438c565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161147d91815260200190565b60405180910390a261148f8383612a57565b505050565b600054610100900460ff16158080156114b45750600054600160ff909116105b806114ce5750303b1580156114ce575060005460ff166001145b6115315760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff191660011790558015611554576000805461ff0019166101001790555b6001600160a01b0382166115c75760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015610fb3576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146116955760405162461bcd60e51b815260040161067590614175565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611721919061403e565b1561173e5760405162461bcd60e51b81526004016106759061405b565b82518451146117c95760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b845181101561183757611825838583815181106117eb576117eb6141bd565b6020026020010151878481518110611805576118056141bd565b60200260200101516001600160a01b0316612a619092919063ffffffff16565b8061182f816141fa565b9150506117cc565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156118a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ca919061403e565b156118e75760405162461bcd60e51b81526004016106759061405b565b603a54600160401b90046001600160401b0316806119935760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b6060820152906119e39087612ab3565b6000805b85811015611b6f57600060366000898985818110611a0757611a076141bd565b9050602002810190611a1991906143b4565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611a8757611a87613c83565b6002811115611a9857611a98613c83565b9052509050600181606001516002811115611ab557611ab5613c83565b14611ac05750611b5d565b846001600160401b031681604001516001600160401b031610611ae35750611b5d565b600080611b1683888d358d8d89818110611aff57611aff6141bd565b9050602002810190611b1191906143b4565b612c2f565b602088018051929450909250611b2b826143d4565b62ffffff16905250606086018051839190611b479083906143f3565b600f0b905250611b578186614442565b94505050505b80611b67816141fa565b9150506119e7565b506001600160401b038084166000908152603b6020526040812080548493919291611b9c91859116614442565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550611bc982612e35565b50505050505050565b600081600081518110611be757611be76141bd565b60200260200101519050919050565b600081600381518110611c0b57611c0b6141bd565b60200260200101516000801b14159050919050565b6000611c2f611fff600c61446d565b611c426001600160401b0384164261448c565b10611cac5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611cf4916144a3565b600060405180830381855afa9150503d8060008114611d2f576040519150601f19603f3d011682016040523d82523d6000602084013e611d34565b606091505b5091509150818015611d47575060008151115b15611d685780806020019051810190611d6091906144b5565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b611de26003602061446d565b611def602083018361412f565b905014611e645760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611eb4611e74602083018361412f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692505084359050600361303c565b610fb35760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b60088414611fac5760405162461bcd60e51b815260206004820152604e60248201526000805160206146bd83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b6005611fba60286001614117565b611fc49190614117565b611fcf90602061446d565b821461203d5760405162461bcd60e51b815260206004820152604360248201526000805160206146bd83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061207b86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061305492505050565b9050600064ffffffffff831661209360286001614117565b600b901b1790506120de85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925086915085905061303c565b61213e5760405162461bcd60e51b815260206004820152603d60248201526000805160206146bd83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156121e95760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561226e5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661228b633b9aca0047614378565b612295919061438c565b90508180156122ab57506001600160401b038116155b1561231e5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061233442611c20565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061238f81612e35565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612409848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bd292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561247857612478613c83565b600281111561248957612489613c83565b90525090506000816060015160028111156124a6576124a6613c83565b146125495760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b03801661258f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061330192505050565b6001600160401b0316146126195760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612621612a12565b61262a906144ce565b61266686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061332692505050565b146126e75760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061272586868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061333b92505050565b90506127358a87878b8b8e611f31565b60398054906000612745836141fa565b9091555050603a54600090600160401b90046001600160401b03161561277d57603a54600160401b90046001600160401b031661278a565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561286057612860613c83565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612908633b9aca006001600160401b03841661446d565b9c9b505050505050505050505050565b600081516030146129a15760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b6040516002906129b89084906000906020016144f2565b60408051601f19818403018152908290526129d2916144a3565b602060405180830381855afa1580156129ef573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610dc791906144b5565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b610fb38282613353565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261148f90849061346c565b612abf60056003614117565b612aca90602061446d565b612ad7602083018361412f565b905014612b5a5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612bab612b6c602084018461412f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925050853590508461303c565b61148f5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612c4787848861353e565b9050816001600160401b0316816001600160401b031614612cc157612c6c81836136b5565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612d455760398054906000612cef83614521565b9091555050600260608a0152612d0485614538565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612de557612de5613c83565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff16612fbc576000633b9aca00826060015183604001516001600160401b0316612e6791906143f3565b600f0b612e74919061455f565b6040830151603480549293509091600090612e999084906001600160401b0316614442565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612f5e57600080fd5b505af1158015612f72573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b60008361304a8685856136cd565b1495945050505050565b600080600283516130659190614378565b90506000816001600160401b0381111561308157613081613e31565b6040519080825280602002602001820160405280156130aa578160200160208202803683370190505b50905060005b828110156131b1576002856130c5838361446d565b815181106130d5576130d56141bd565b6020026020010151868360026130eb919061446d565b6130f6906001614117565b81518110613106576131066141bd565b6020026020010151604051602001613128929190918252602082015260400190565b60408051601f1981840301815290829052613142916144a3565b602060405180830381855afa15801561315f573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061318291906144b5565b828281518110613194576131946141bd565b6020908102919091010152806131a9816141fa565b9150506130b0565b506131bd600283614378565b91505b81156132dd5760005b828110156132ca576002826131de838361446d565b815181106131ee576131ee6141bd565b602002602001015183836002613204919061446d565b61320f906001614117565b8151811061321f5761321f6141bd565b6020026020010151604051602001613241929190918252602082015260400190565b60408051601f198184030181529082905261325b916144a3565b602060405180830381855afa158015613278573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061329b91906144b5565b8282815181106132ad576132ad6141bd565b6020908102919091010152806132c2816141fa565b9150506131c9565b506132d6600283614378565b91506131c0565b806000815181106132f0576132f06141bd565b602002602001015192505050919050565b6000610dc782600681518110613319576133196141bd565b6020026020010151613819565b600081600181518110611be757611be76141bd565b6000610dc782600281518110613319576133196141bd565b804710156133a35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146133f0576040519150601f19603f3d011682016040523d82523d6000602084013e6133f5565b606091505b505090508061148f5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b60006134c1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138809092919063ffffffff16565b80519091501561148f57808060200190518101906134df919061403e565b61148f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b600061354c60266001614117565b61355790602061446d565b613564604084018461412f565b9050146135d55760405162461bcd60e51b8152602060048201526044602482018190526000805160206146bd833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b60006135e26004856145e4565b64ffffffffff16905061363c6135fb604085018561412f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505060208601358461303c565b61369c5760405162461bcd60e51b815260206004820152603e60248201526000805160206146bd83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b6136aa83602001358561388f565b9150505b9392505050565b60006136ae6001600160401b03808416908516614608565b600083516000141580156136ec5750602084516136ea9190614364565b155b61377b5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b8551811161380f5761379f600285614364565b6137d2578151600052808601516020526020826040600060026107d05a03fa6137c757600080fd5b6002840493506137fd565b8086015160005281516020526020826040600060026107d05a03fa6137f657600080fd5b6002840493505b613808602082614117565b905061378c565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611d6084846000856138bc565b60008061389d600484614658565b6138a890604061467c565b64ffffffffff169050611d6084821b613819565b60608247101561391d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b0316858760405161399091906144a3565b60006040518083038185875af1925050503d80600081146139cd576040519150601f19603f3d011682016040523d82523d6000602084013e6139d2565b606091505b50915091506139e28282866139ed565b979650505050505050565b606083156139fc5750816136ae565b825115613a0c5782518084602001fd5b8160405162461bcd60e51b815260040161067591906146a9565b80356001600160401b0381168114613a3d57600080fd5b919050565b600060408284031215613a5457600080fd5b50919050565b600080600060608486031215613a6f57600080fd5b613a7884613a26565b925060208401356001600160401b0380821115613a9457600080fd5b613aa087838801613a42565b93506040860135915080821115613ab657600080fd5b50613ac386828701613a42565b9150509250925092565b60008083601f840112613adf57600080fd5b5081356001600160401b03811115613af657600080fd5b6020830191508360208260051b8501011115613b1157600080fd5b9250929050565b60008060008060008060008060a0898b031215613b3457600080fd5b613b3d89613a26565b975060208901356001600160401b0380821115613b5957600080fd5b613b658c838d01613a42565b985060408b0135915080821115613b7b57600080fd5b613b878c838d01613acd565b909850965060608b0135915080821115613ba057600080fd5b613bac8c838d01613acd565b909650945060808b0135915080821115613bc557600080fd5b50613bd28b828c01613acd565b999c989b5096995094979396929594505050565b600060208284031215613bf857600080fd5b6136ae82613a26565b60008083601f840112613c1357600080fd5b5081356001600160401b03811115613c2a57600080fd5b602083019150836020828501011115613b1157600080fd5b60008060208385031215613c5557600080fd5b82356001600160401b03811115613c6b57600080fd5b613c7785828601613c01565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613cb757634e487b7160e01b600052602160045260246000fd5b9052565b60208101610dc78284613c99565b600060208284031215613cdb57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613d236060840182613c99565b5092915050565b801515811461303957600080fd5b600060208284031215613d4a57600080fd5b81356136ae81613d2a565b600080600080600060608688031215613d6d57600080fd5b85356001600160401b0380821115613d8457600080fd5b613d9089838a01613c01565b90975095506020880135915080821115613da957600080fd5b50613db688828901613c01565b96999598509660400135949350505050565b6001600160a01b038116811461303957600080fd5b8035613a3d81613dc8565b60008060408385031215613dfb57600080fd5b8235613e0681613dc8565b946020939093013593505050565b600060208284031215613e2657600080fd5b81356136ae81613dc8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613e6f57613e6f613e31565b604052919050565b60006001600160401b03821115613e9057613e90613e31565b5060051b60200190565b600082601f830112613eab57600080fd5b81356020613ec0613ebb83613e77565b613e47565b82815260059290921b84018101918181019086841115613edf57600080fd5b8286015b84811015613efa5780358352918301918301613ee3565b509695505050505050565b600080600060608486031215613f1a57600080fd5b83356001600160401b0380821115613f3157600080fd5b818601915086601f830112613f4557600080fd5b81356020613f55613ebb83613e77565b82815260059290921b8401810191818101908a841115613f7457600080fd5b948201945b83861015613f9b578535613f8c81613dc8565b82529482019490820190613f79565b97505087013592505080821115613fb157600080fd5b50613fbe86828701613e9a565b925050613fcd60408501613ddd565b90509250925092565b600080600060408486031215613feb57600080fd5b83356001600160401b038082111561400257600080fd5b61400e87838801613a42565b9450602086013591508082111561402457600080fd5b5061403186828701613acd565b9497909650939450505050565b60006020828403121561405057600080fd5b81516136ae81613d2a565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e198436030181126140cf57600080fd5b8301803591506001600160401b038211156140e957600080fd5b6020019150600581901b3603821315613b1157600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561412a5761412a614101565b500190565b6000808335601e1984360301811261414657600080fd5b8301803591506001600160401b0382111561416057600080fd5b602001915036819003821315613b1157600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156141e557600080fd5b813564ffffffffff811681146136ae57600080fd5b600060001982141561420e5761420e614101565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156142aa578181015183820152602001614292565b838111156142b9576000848401525b50505050565b600081518084526142d781602086016020860161428f565b601f01601f19169290920160200192915050565b6080815260006142ff60808301888a614266565b828103602084015261431181886142bf565b90508281036040840152614326818688614266565b915050826060830152979650505050505050565b602081526000611d60602083018486614266565b634e487b7160e01b600052601260045260246000fd5b6000826143735761437361434e565b500690565b6000826143875761438761434e565b500490565b60006001600160401b03838116908316818110156143ac576143ac614101565b039392505050565b60008235605e198336030181126143ca57600080fd5b9190910192915050565b600062ffffff8216806143e9576143e9614101565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561441d5761441d614101565b8260016001607f1b031903821281161561443957614439614101565b50019392505050565b60006001600160401b0380831681851680830382111561446457614464614101565b01949350505050565b600081600019048311821515161561448757614487614101565b500290565b60008282101561449e5761449e614101565b500390565b600082516143ca81846020870161428f565b6000602082840312156144c757600080fd5b5051919050565b80516020808301519190811015613a545760001960209190910360031b1b16919050565b6000835161450481846020880161428f565b6001600160801b0319939093169190920190815260100192915050565b60008161453057614530614101565b506000190190565b600081600f0b60016001607f1b031981141561455657614556614101565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561458557614585614101565b600160ff1b60008712828116878305891216156145a4576145a4614101565b600087129250878205871284841616156145c0576145c0614101565b878505871281841616156145d6576145d6614101565b505050929093029392505050565b600064ffffffffff808416806145fc576145fc61434e565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561463357614633614101565b8160016001607f1b0301831381161561464e5761464e614101565b5090039392505050565b600064ffffffffff808416806146705761467061434e565b92169190910692915050565b600064ffffffffff808316818516818304811182151516156146a0576146a0614101565b02949350505050565b6020815260006136ae60208301846142bf56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220e7fb097b8f357555160a99d255cbd73600b1e7b58eeaa1b52ccec889f1e8ba7064736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b50604051620049d1380380620049d1833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147b36200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612fb9015260008181610483015261113701526147b36000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613afb565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613bb9565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c87565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613ce3565b610e12565b6040516101d99190613d5c565b34801561041957600080fd5b5061042d610428366004613d6a565b610e77565b6040516101d99190613d83565b34801561044657600080fd5b50610400610455366004613d6a565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dd9565b610f24565b6101a36104d3366004613df6565b611061565b3480156104e457600080fd5b5061042d6104f3366004613ce3565b61120e565b34801561050457600080fd5b506101a3610513366004613e89565b611301565b34801561052457600080fd5b506101a3610533366004613eb5565b61153e565b34801561054457600080fd5b506101a3610553366004613fa6565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614077565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140df565b1561067e5760405162461bcd60e51b8152600401610675906140fc565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140df565b156107275760405162461bcd60e51b8152600401610675906140fc565b600061076d6107368580614159565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d24565b60028111156107ed576107ed613d24565b8152505090506212750081604001516001600160401b031661080f91906141b8565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d24565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b8680614159565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c9792505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611cc1565b87611e77565b610a0b86356109f78780614159565b610a0460208a018a6141d0565b8651611fd2565b610a1560006121e9565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140df565b15610af15760405162461bcd60e51b8152600401610675906140fc565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611cc1565b89611e77565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe61425e565b9050602002016020810190610d139190614274565b8a8a86818110610d2557610d2561425e565b9050602002810190610d3791906141d0565b8a8a88818110610d4957610d4961425e565b9050602002810190610d5b9190614159565b61246b565b610d6a90836141b8565b915080610d768161429b565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b992505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d24565b6002811115610f1b57610f1b613d24565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140df565b15610ff75760405162461bcd60e51b8152600401610675906140fc565b611000826121e9565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b8152600401610675906142b6565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612ab3565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061438c565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143db565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b992505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d24565b60028111156112f7576112f7613d24565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b8152600401610675906142b6565b611357633b9aca0082614405565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca0083614419565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b031661442d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612af8565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140df565b156117e85760405162461bcd60e51b8152600401610675906140fc565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf838583815181106118955761189561425e565b60200260200101518784815181106118af576118af61425e565b60200260200101516001600160a01b0316612b029092919063ffffffff16565b806118d98161429b565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140df565b156119915760405162461bcd60e51b8152600401610675906140fc565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612b54565b6000805b85811015611c1957600060366000898985818110611ab157611ab161425e565b9050602002810190611ac39190614455565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611b3157611b31613d24565b6002811115611b4257611b42613d24565b9052509050600181606001516002811115611b5f57611b5f613d24565b14611b6a5750611c07565b846001600160401b031681604001516001600160401b031610611b8d5750611c07565b600080611bc083888d358d8d89818110611ba957611ba961425e565b9050602002810190611bbb9190614455565b612cd0565b602088018051929450909250611bd582614475565b62ffffff16905250606086018051839190611bf1908390614494565b600f0b905250611c0181866144e3565b94505050505b80611c118161429b565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611c46918591166144e3565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612ed6565b600081600081518110611c8857611c8861425e565b60200260200101519050919050565b600081600381518110611cac57611cac61425e565b60200260200101516000801b14159050919050565b6000611cd0611fff600c61450e565b611ce36001600160401b0384164261452d565b10611d4d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611d9591614544565b600060405180830381855afa9150503d8060008114611dd0576040519150601f19603f3d011682016040523d82523d6000602084013e611dd5565b606091505b5091509150818015611de8575060008151115b15611e095780806020019051810190611e019190614556565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b611e836003602061450e565b611e9060208301836141d0565b905014611f055760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611f55611f1560208301836141d0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130dd565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b6008841461204d5760405162461bcd60e51b815260206004820152604e602482015260008051602061475e83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561205b602860016141b8565b61206591906141b8565b61207090602061450e565b82146120de5760405162461bcd60e51b8152602060048201526043602482015260008051602061475e83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061211c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130f592505050565b9050600064ffffffffff8316612134602860016141b8565b600b901b17905061217f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130dd565b6121df5760405162461bcd60e51b815260206004820152603d602482015260008051602061475e83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b03161561228a5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561230f5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661232c633b9aca0047614419565b612336919061442d565b905081801561234c57506001600160401b038116155b156123bf5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b600060405180608001604052806123d542611cc1565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061243081612ed6565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124aa848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561251957612519613d24565b600281111561252a5761252a613d24565b905250905060008160600151600281111561254757612547613d24565b146125ea5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126308686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a292505050565b6001600160401b0316146126ba5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b6126c2612ab3565b6126cb9061456f565b6127078686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c792505050565b146127885760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006127c68686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133dc92505050565b90506127d68a87878b8b8e611fd2565b603980549060006127e68361429b565b9091555050603a54600090600160401b90046001600160401b03161561281e57603a54600160401b90046001600160401b031661282b565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561290157612901613d24565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16129a9633b9aca006001600160401b03841661450e565b9c9b505050505050505050505050565b60008151603014612a425760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612a59908490600090602001614593565b60408051601f1981840301815290829052612a7391614544565b602060405180830381855afa158015612a90573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614556565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133f4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261153990849061350d565b612b60600560036141b8565b612b6b90602061450e565b612b7860208301836141d0565b905014612bfb5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612c4c612c0d60208401846141d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130dd565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612ce88784886135df565b9050816001600160401b0316816001600160401b031614612d6257612d0d8183613756565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612de65760398054906000612d90836145c2565b9091555050600260608a0152612da5856145d9565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612e8657612e86613d24565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff1661305d576000633b9aca00826060015183604001516001600160401b0316612f089190614494565b600f0b612f159190614600565b6040830151603480549293509091600090612f3a9084906001600160401b03166144e3565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130eb86858561376e565b1495945050505050565b600080600283516131069190614419565b90506000816001600160401b0381111561312257613122613ed2565b60405190808252806020026020018201604052801561314b578160200160208202803683370190505b50905060005b8281101561325257600285613166838361450e565b815181106131765761317661425e565b60200260200101518683600261318c919061450e565b6131979060016141b8565b815181106131a7576131a761425e565b60200260200101516040516020016131c9929190918252602082015260400190565b60408051601f19818403018152908290526131e391614544565b602060405180830381855afa158015613200573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132239190614556565b8282815181106132355761323561425e565b60209081029190910101528061324a8161429b565b915050613151565b5061325e600283614419565b91505b811561337e5760005b8281101561336b5760028261327f838361450e565b8151811061328f5761328f61425e565b6020026020010151838360026132a5919061450e565b6132b09060016141b8565b815181106132c0576132c061425e565b60200260200101516040516020016132e2929190918252602082015260400190565b60408051601f19818403018152908290526132fc91614544565b602060405180830381855afa158015613319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061333c9190614556565b82828151811061334e5761334e61425e565b6020908102919091010152806133638161429b565b91505061326a565b50613377600283614419565b9150613261565b806000815181106133915761339161425e565b602002602001015192505050919050565b6000610e71826006815181106133ba576133ba61425e565b60200260200101516138ba565b600081600181518110611c8857611c8861425e565b6000610e71826002815181106133ba576133ba61425e565b804710156134445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613491576040519150601f19603f3d011682016040523d82523d6000602084013e613496565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613562826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139219092919063ffffffff16565b805190915015611539578080602001905181019061358091906140df565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ed602660016141b8565b6135f890602061450e565b61360560408401846141d0565b9050146136765760405162461bcd60e51b81526020600482015260446024820181905260008051602061475e833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613683600485614685565b64ffffffffff1690506136dd61369c60408501856141d0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130dd565b61373d5760405162461bcd60e51b815260206004820152603e602482015260008051602061475e83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61374b836020013585613930565b9150505b9392505050565b600061374f6001600160401b038084169085166146a9565b6000835160001415801561378d57506020845161378b9190614405565b155b61381c5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b855181116138b057613840600285614405565b613873578151600052808601516020526020826040600060026107d05a03fa61386857600080fd5b60028404935061389e565b8086015160005281516020526020826040600060026107d05a03fa61389757600080fd5b6002840493505b6138a96020826141b8565b905061382d565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e01848460008561395d565b60008061393e6004846146f9565b61394990604061471d565b64ffffffffff169050611e0184821b6138ba565b6060824710156139be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b613a155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a319190614544565b60006040518083038185875af1925050503d8060008114613a6e576040519150601f19603f3d011682016040523d82523d6000602084013e613a73565b606091505b5091509150613a83828286613a8e565b979650505050505050565b60608315613a9d57508161374f565b825115613aad5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061474a565b80356001600160401b0381168114613ade57600080fd5b919050565b600060408284031215613af557600080fd5b50919050565b600080600060608486031215613b1057600080fd5b613b1984613ac7565b925060208401356001600160401b0380821115613b3557600080fd5b613b4187838801613ae3565b93506040860135915080821115613b5757600080fd5b50613b6486828701613ae3565b9150509250925092565b60008083601f840112613b8057600080fd5b5081356001600160401b03811115613b9757600080fd5b6020830191508360208260051b8501011115613bb257600080fd5b9250929050565b60008060008060008060008060a0898b031215613bd557600080fd5b613bde89613ac7565b975060208901356001600160401b0380821115613bfa57600080fd5b613c068c838d01613ae3565b985060408b0135915080821115613c1c57600080fd5b613c288c838d01613b6e565b909850965060608b0135915080821115613c4157600080fd5b613c4d8c838d01613b6e565b909650945060808b0135915080821115613c6657600080fd5b50613c738b828c01613b6e565b999c989b5096995094979396929594505050565b600060208284031215613c9957600080fd5b61374f82613ac7565b60008083601f840112613cb457600080fd5b5081356001600160401b03811115613ccb57600080fd5b602083019150836020828501011115613bb257600080fd5b60008060208385031215613cf657600080fd5b82356001600160401b03811115613d0c57600080fd5b613d1885828601613ca2565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d5857634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d3a565b600060208284031215613d7c57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613dc46060840182613d3a565b5092915050565b80151581146130da57600080fd5b600060208284031215613deb57600080fd5b813561374f81613dcb565b600080600080600060608688031215613e0e57600080fd5b85356001600160401b0380821115613e2557600080fd5b613e3189838a01613ca2565b90975095506020880135915080821115613e4a57600080fd5b50613e5788828901613ca2565b96999598509660400135949350505050565b6001600160a01b03811681146130da57600080fd5b8035613ade81613e69565b60008060408385031215613e9c57600080fd5b8235613ea781613e69565b946020939093013593505050565b600060208284031215613ec757600080fd5b813561374f81613e69565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f1057613f10613ed2565b604052919050565b60006001600160401b03821115613f3157613f31613ed2565b5060051b60200190565b600082601f830112613f4c57600080fd5b81356020613f61613f5c83613f18565b613ee8565b82815260059290921b84018101918181019086841115613f8057600080fd5b8286015b84811015613f9b5780358352918301918301613f84565b509695505050505050565b600080600060608486031215613fbb57600080fd5b83356001600160401b0380821115613fd257600080fd5b818601915086601f830112613fe657600080fd5b81356020613ff6613f5c83613f18565b82815260059290921b8401810191818101908a84111561401557600080fd5b948201945b8386101561403c57853561402d81613e69565b8252948201949082019061401a565b9750508701359250508082111561405257600080fd5b5061405f86828701613f3b565b92505061406e60408501613e7e565b90509250925092565b60008060006040848603121561408c57600080fd5b83356001600160401b03808211156140a357600080fd5b6140af87838801613ae3565b945060208601359150808211156140c557600080fd5b506140d286828701613b6e565b9497909650939450505050565b6000602082840312156140f157600080fd5b815161374f81613dcb565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261417057600080fd5b8301803591506001600160401b0382111561418a57600080fd5b6020019150600581901b3603821315613bb257600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141cb576141cb6141a2565b500190565b6000808335601e198436030181126141e757600080fd5b8301803591506001600160401b0382111561420157600080fd5b602001915036819003821315613bb257600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561428657600080fd5b813564ffffffffff8116811461374f57600080fd5b60006000198214156142af576142af6141a2565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561434b578181015183820152602001614333565b8381111561435a576000848401525b50505050565b60008151808452614378816020860160208601614330565b601f01601f19169290920160200192915050565b6080815260006143a060808301888a614307565b82810360208401526143b28188614360565b905082810360408401526143c7818688614307565b915050826060830152979650505050505050565b602081526000611e01602083018486614307565b634e487b7160e01b600052601260045260246000fd5b600082614414576144146143ef565b500690565b600082614428576144286143ef565b500490565b60006001600160401b038381169083168181101561444d5761444d6141a2565b039392505050565b60008235605e1983360301811261446b57600080fd5b9190910192915050565b600062ffffff82168061448a5761448a6141a2565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144be576144be6141a2565b8260016001607f1b03190382128116156144da576144da6141a2565b50019392505050565b60006001600160401b03808316818516808303821115614505576145056141a2565b01949350505050565b6000816000190483118215151615614528576145286141a2565b500290565b60008282101561453f5761453f6141a2565b500390565b6000825161446b818460208701614330565b60006020828403121561456857600080fd5b5051919050565b80516020808301519190811015613af55760001960209190910360031b1b16919050565b600083516145a5818460208801614330565b6001600160801b0319939093169190920190815260100192915050565b6000816145d1576145d16141a2565b506000190190565b600081600f0b60016001607f1b03198114156145f7576145f76141a2565b60000392915050565b60006001600160ff1b0381841382841380821686840486111615614626576146266141a2565b600160ff1b6000871282811687830589121615614645576146456141a2565b60008712925087820587128484161615614661576146616141a2565b87850587128184161615614677576146776141a2565b505050929093029392505050565b600064ffffffffff8084168061469d5761469d6143ef565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146d4576146d46141a2565b8160016001607f1b030183138116156146ef576146ef6141a2565b5090039392505050565b600064ffffffffff80841680614711576147116143ef565b92169190910692915050565b600064ffffffffff80831681851681830481118215151615614741576147416141a2565b02949350505050565b60208152600061374f602083018461436056fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220125218a8c329c9b9f3802bb5717f96d1f9bdf5f76bd9e7ff7ad25795cc3cb1c064736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 863744bf2..6fcf36454 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -314,6 +314,7 @@ contract EigenPod is BeaconChainProofs.ValidatorProof calldata proof ) external + onlyWhenNotPaused(PAUSED_START_CHECKPOINT) onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) { bytes32 validatorPubkey = proof.validatorFields.getPubkeyHash(); From 87760bf87c887740c6317556c02184359143204c Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 18 Jun 2024 16:09:17 +0000 Subject: [PATCH 24/85] docs: add initial EigenPod docs * docs: clean and update EigenPodManager docs * chore: small wip to eigenpod docs and contract comment cleanup --- docs/core/EigenPod.md | 344 +++++++++++++++ docs/core/EigenPodManager.md | 572 ++----------------------- pkg/bindings/EigenPod/binding.go | 2 +- src/contracts/pods/EigenPod.sol | 14 +- src/contracts/pods/EigenPodStorage.sol | 8 +- 5 files changed, 398 insertions(+), 542 deletions(-) create mode 100644 docs/core/EigenPod.md diff --git a/docs/core/EigenPod.md b/docs/core/EigenPod.md new file mode 100644 index 000000000..6d698e20f --- /dev/null +++ b/docs/core/EigenPod.md @@ -0,0 +1,344 @@ +[eip-4788]: https://eips.ethereum.org/EIPS/eip-4788 +[custom-types]: https://eth2book.info/capella/part3/config/types/#custom-types +[validator-container]: https://eth2book.info/capella/part3/containers/dependencies/#validator + +## EigenPod + +| File | Type | Proxy | +| -------- | -------- | -------- | +| [`EigenPod.sol`](../../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | + +An `EigenPod` is deployed via the `EigenPodManager` by a Staker (referred to in this doc as the _Pod Owner_). `EigenPods` allow a Pod Owner to restake one or more beacon chain validators, earning shares which can be delegated to Operators to earn yield. When a Pod Owner begins running a validator on the beacon chain, they choose _withdrawal credentials_ for that validator. Withdrawal credentials are the ETH address to which: +* A validator's _principal_ is sent when the validator exits the beacon chain +* A validator's _consensus rewards_ are sent as the validator proposes/attests to blocks on the beacon chain + +Additionally, when running validator node software, a validator is configured with a _fee recipient_. The fee recipient receives: +* _Execution layer rewards_ when the validator proposes a block +* _MEV rewards_ if the validator is running MEV-boost/other custom block proposer software + +**An `EigenPod` may serve as EITHER/BOTH the withdrawal credentials OR the fee recipient for your validators.** In prior releases, it was only possible to use an `EigenPod` for withdrawal credentials. However, this is no longer the case! + +--- + +The **primary goal** of the `EigenPod` system is to **ensure that shares are backed 1:1** with ETH that is _either already in the `EigenPod`, or will eventually flow through the `EigenPod`._ To support this goal, `EigenPods`: +* serve as the withdrawal credentials for one or more beacon chain validators controlled by the Pod Owner +* validate beacon chain state proofs +* interpret these proofs to add or remove shares in the beacon chain ETH strategy + +Because beacon chain proofs are processed asynchronously from the beacon chain itself, there is an inherent _lag_ between an event on the beacon chain and a corresponding share update in any affected `EigenPods`. Therefore, the **secondary goals** of the `EigenPod` system are to **minimize lag where possible** and to **ensure various timing windows cannot (i) create unbacked shares or (ii) prevent the withdrawal of existing shares.** + +#### High-level Concepts + +* [Restaking Beacon Chain ETH](#restaking-beacon-chain-eth) +* [Checkpointing Validators](#checkpointing-validators) +* [Staleness Proofs](#staleness-proofs) +* [Other Methods](#other-methods) +* [Compatibility with Previous Versions](#compatibility-with-previous-versions) + +#### Important Definitions + +**_Pod Owner_**: A Staker who has deployed an `EigenPod` is a _Pod Owner_. The terms are used interchangeably in this document. +* _Pod Owners_ can only deploy a single `EigenPod`, but can restake any number of beacon chain validators from the same `EigenPod`. +* _Pod Owners_ can delegate their `EigenPodManager` shares to Operators (via `DelegationManager`). +* These shares correspond to the amount of restaked beacon chain ETH held by the _Pod Owner_ via their `EigenPod`. + +**_Active validator set_**: This term is used frequently in this document to describe the set of validators whose withdrawal credentials have been verified to be pointed at an `EigenPod`. The _active validator set_ is used to determine the number of proofs required to complete a checkpoint (see [Checkpointing Validators](#checkpointing-validators)). +* A validator enters the _active validator set_ when their withdrawal credentials are verified (see [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials)) +* A validator leaves the _active validator set_ when a checkpoint proof shows they have 0 balance (see [`verifyCheckpointProofs`](#verifycheckpointproofs)) + +In the implemtation, the _active validator set_ is comprised of two state variables: +* `uint256 activeValidatorCount` + * incremented by 1 when a validator enters the _active validator set_ + * decremented by 1 when a validator leaves the _active validator set_ +* `mapping(bytes32 => ValidatorInfo) _validatorPubkeyHashToInfo` (specifically, the `status` field) + * `VALIDATOR_STATUS.INACTIVE -> VALIDATOR_STATUS.ACTIVE` when entering the _active validator set_ + * `VALIDATOR_STATUS.ACTIVE -> VALIDATOR_STATUS.WITHDRAWN` when leaving the _active validator set_ + +**_Checkpoint_**: A snapshot of `EigenPod` and beacon chain state used to update the _Pod Owner's_ shares based on a combination of beacon chain balance and native ETH balance. Checkpoints allow an `EigenPod` to account for validator exits, partial withdrawals of consensus rewards, or execution layer fees earned by their validators. Completing a checkpoint will account for these amounts in the `EigenPod`, enabling the _Pod Owner_ to compound their restaked shares or withdraw accumulated yield. + +Only one _checkpoint_ can be active at a time in a given `EigenPod`. The pod's _current checkpoint_ is represented by the following data structure: + +```solidity +struct Checkpoint { + bytes32 beaconBlockRoot; // proofs are verified against a beacon block root + uint24 proofsRemaining; // number of proofs remaining before the checkpoint is completed + uint64 podBalanceGwei; // native ETH that will be awarded shares when the checkpoint is completed + int128 balanceDeltasGwei; // total change in beacon chain balance tracked across submitted proofs +} +``` + +Checkpoints are completed by submitting one beacon chain proof per validator in the pod's _active validator set_. See [Checkpointing Validators](#checkpointing-validators) for details. + +--- + +### Restaking Beacon Chain ETH + +If a Pod Owner has validators whose withdrawal credentials are an `EigenPod`, the Pod Owner can use `verifyWithdrawalCredentials` to begin restaking ETH while it is still on the beacon chain. Once a validator's withdrawal credentials are verified: +* the Pod Owner receives delegatable shares via `EigenPodManager.podOwnerShares` +* the validator enters the pod's _active validator set_, and must be included in future checkpoint proofs (see [Checkpointing Validators](#checkpointing-validators)) + +_Methods:_ +* [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials) + +#### `verifyWithdrawalCredentials` + +```solidity +function verifyWithdrawalCredentials( + uint64 beaconTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + uint40[] calldata validatorIndices, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields +) + external + onlyEigenPodOwner + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) + +struct StateRootProof { + bytes32 beaconStateRoot; + bytes proof; +} +``` + +This method first verifies a beacon state root against a beacon block root returned by the [EIP-4788 oracle][eip-4788]. Then, it verifies one or more withdrawal credential proofs against the beacon state root. Finally, the Pod Owner is awarded shares according to the sum of the effective balance of each verified validator (via `EigenPodManager.recordBeaconChainETHBalanceUpdate`). + +A withdrawal credential proof uses a validator's [`ValidatorIndex`][custom-types] and a merkle proof to prove the existence of a [`Validator` container][validator-container] at a given block. The beacon chain `Validator` container holds important information used in this method: +* `pubkey`: A BLS pubkey hash, used to uniquely identify the validator within the `EigenPod` +* `withdrawal_credentials`: Used to verify that the validator will withdraw its principal to this `EigenPod` if it exits the beacon chain +* `effective_balance`: The balance of the validator, updated once per epoch and capped at 32 ETH. Used to award shares to the Pod Owner +* `exit_epoch`: Initially set to `type(uint64).max`, this value is updated when a validator initiates exit from the beacon chain. This method requires that a validator _has not initiated an exit from the beacon chain_ + +_Note that it is not required to verify your validator's withdrawal credentials_, unless you want to receive shares for ETH on the beacon chain. You may choose to use your `EigenPod` without verifying withdrawal credentials; you will still be able to withdraw yield (or receive shares for yield) via the [checkpoint system](#checkpointing-validators). + +*Effects*: +* For each set of unique verified withdrawal credentials: + * `activeValidatorCount` is increased by 1 + * The validator's info is recorded in state (`_validatorPubkeyHashToInfo[pubkeyHash]`): + * `validatorIndex` is recorded from the passed-in `validatorIndices` + * `restakedBalanceGwei` is set to the validator's effective balance + * `lastCheckpointedAt` is set to either the `lastCheckpointTimestamp` or `currentCheckpointTimestamp` + * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE` +* The Pod Owner is awarded shares according to the sum of effective balances proven. See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO) + +*Requirements*: +* Caller MUST be the Pod Owner +* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS` +* `hasRestaked` MUST be set to `true` + * Note: for the majority of pods, this is `true` by default (see [Compatibility with Previous Versions](#compatibility-with-previous-versions)) +* Input array lengths MUST be equal +* `beaconTimestamp`: + * MUST be greater than BOTH `lastCheckpointTimestamp` AND `currentCheckpointTimestamp` + * MUST be queryable via the [EIP-4788 oracle][eip-4788]. Generally, this means `beaconTimestamp` corresponds to a valid beacon block created within the last 24 hours. +* `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle +* For each validator: + * The validator MUST NOT have been previously-verified (`VALIDATOR_STATUS` should be `INACTIVE`) + * The validator's `exit_epoch` MUST equal `type(uint64).max` (aka `FAR_FUTURE_EPOCH`) + * The validator's `withdrawal_credentials` MUST be pointed to the `EigenPod` + * `validatorFieldsProof` MUST be a valid merkle proof of the corresponding `validatorFields` under the `beaconStateRoot` at the given `validatorIndex` +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO) + +--- + +### Checkpointing Validators + +Checkpoint proofs comprise the bulk of proofs submitted to an `EigenPod`. Completing a checkpoint means submitting _one checkpoint proof for each validator_ in the pod's _active validator set._ + +`EigenPods` use checkpoints to detect: +* when validators have exited from the beacon chain, leaving the pod's _active validator set_ +* when the pod has accumulated fees / partial withdrawals from validators +* whether any validators on the beacon chain have increased/decreased in balance + +When a checkpoint is completed, shares are updated accordingly for each of these events. Shares can be withdrawn via the `DelegationManager` withdrawal queue (see [DelegationManager: Undelegating and Withdrawing](./DelegationManager.md#undelegating-and-withdrawing)), which means an `EigenPod's` checkpoint proofs also play an important role in allowing Pod Owners to exit funds from the system. + +_Important Notes:_ +* `EigenPods` can only have **one active checkpoint** at a given time, and once started, checkpoints **cannot be cancelled** (only completed) +* Checkpoint proofs are based entirely off of _current balance_ proofs. Even though partial/full withdrawals are processed via checkpoint proofs, this system does NOT use withdrawal proofs. + +_Methods:_ +* [`startCheckpoint`](#startcheckpoint) +* [`verifyCheckpointProofs`](#verifycheckpointproofs) + +#### `startCheckpoint` + +```solidity +function startCheckpoint(bool revertIfNoBalance) + external + onlyEigenPodOwner() + onlyWhenNotPaused(PAUSED_START_CHECKPOINT) +``` + +This method allows a Pod Owner to start a checkpoint, beginning the process of proving a pod's _active validator set_. `startCheckpoint` takes a snapshot of three things: +* `podBalanceGwei`: the `EigenPod's` native ETH balance, minus any balance already credited with shares through previous checkpoints + * Note: if `revertIfNoBalance == true`, this method will revert if `podBalanceGwei == 0`. This is to allow a Pod Owner to avoid creating a checkpoint unintentionally. +* `activeValidatorCount`: the number of validators in the pod's _active validator set_, aka the number of validators with verified withdrawal credentials who have NOT been proven exited via a previous checkpoint + * This becomes the checkpoint's `proofsRemaining`, or the number of proofs that need to be submitted to `verifyCheckpointProofs` to complete the checkpoint +* `beaconBlockRoot`: the beacon block root of the previous slot, fetched by querying the [EIP-4788 oracle][eip-4788] with the current `block.timestamp` + * This is used as the single source of truth for all proofs submitted for this checkpoint + +`startCheckpoint` plays a very important role in the security of the checkpoint process: it guarantees that _the pod's native ETH balance and any beacon balances proven in the checkpoint are 100% distinct_. That is: if a partial/full exit is processed in the block before `startCheckpoint` is called, then: +* The withdrawn ETH is already in the pod when `startCheckpoint` is called, and is factored into `podBalanceGwei` +* A proof of the validator's current balance against `beaconBlockRoot` will NOT include the withdrawn ETH + +This guarantee means that, if we use the checkpoint to sum up the beacon chain balance of the pod's _active validator set_, **we can award guaranteed-backed shares** according to the sum of the pod's beacon chain balance and its native ETH balance. + +*Effects*: +* Sets `currentCheckpointTimestamp` to `block.timestamp` +* Creates a new `Checkpoint`: + * `beaconBlockRoot`: set to the current block's parent beacon block root, fetched by querying the [EIP-4788 oracle][eip-4788] using `block.timestamp` as input. + * `proofsRemaining`: set to the current value of `activeValidatorCount` (note that this value MAY be 0) + * `podBalanceGwei`: set to the pod's native ETH balance, minus any balance already accounted for in previous checkpoints + * `balanceDeltasGwei`: set to 0 initially +* If `checkpoint.proofsRemaining == 0`, the new checkpoint is auto-completed: + * `withdrawableRestakedExecutionLayerGwei` is increased by `checkpoint.podBalanceGwei` + * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp` + * `currentCheckpointTimestamp` and `_currentCheckpoint` are deleted + * The Pod Owner's shares are updated (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO)) +* If `hasRestaked == false`, sets `hasRestaked` to `true` (see [Compatibility with Previous Versions](#compatibility-with-previous-versions)) + +*Requirements*: +* Caller MUST be the Pod Owner +* Pause status MUST NOT be set: `PAUSED_START_CHECKPOINT` +* A checkpoint MUST NOT be active (`currentCheckpointTimestamp == 0`) +* The last checkpoint completed MUST NOT have been started in the current block (`lastCheckpointTimestamp != block.timestamp`) +* If `revertIfNoBalance == true`, the pod's native ETH balance MUST contain some nonzero value not already accounted for in the _Pod Owner's_ shares + +#### `verifyCheckpointProofs` + +```solidity +function verifyCheckpointProofs( + BeaconChainProofs.BalanceContainerProof calldata balanceContainerProof, + BeaconChainProofs.BalanceProof[] calldata proofs +) + external + onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS) + +struct BalanceContainerProof { + bytes32 balanceContainerRoot; + bytes proof; +} + +struct BalanceProof { + bytes32 pubkeyHash; + bytes32 balanceRoot; + bytes proof; +} +``` + +`verifyCheckpointProofs` is used to make progress on (or complete) the pod's current checkpoint. This method accepts one or more merkle proofs of validators' _current balances_ against a `balanceContainerRoot`. Additionally, a `balanceContainerProof` verifies this `balanceContainerRoot` against the _current checkpoint's_ `beaconBlockRoot`. + +Proofs submitted to this method concern a validator's _current balance,_ NOT their _effective balance_. The _current balance_ is updated every slot, while _effective balances_ are updated roughly once per epoch. Current balances are stored in the [`BeaconState.balances` field](https://eth2book.info/capella/part3/containers/state/#beaconstate). + +For each validator submitted via `proofs`: +* The validator's `status` should be `ACTIVE`. That is, its withdrawal credentials are verified (see [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials)), and it has a nonzero balance as of the last time it was seen in a checkpoint proof. +* The validator's `lastCheckpointedAt` should be less than `currentCheckpointTimestamp`. This is to prevent a validator from counting towards a checkpoint's progression more than once. + +If either of these two conditions is not met, _the proof will be skipped but execution will continue_. Execution continues without reverting to prevent a potential griefing vector where anyone could frontrun a batch of proofs, submit one proof from the batch, and cause the batch to revert. + +Each valid proof submitted decreases the _current checkpoint's_ `proofsRemaining` by 1. If `proofsRemaining` hits 0 the checkpoint is automatically completed, updating the Pod Owner's shares accordingly. + +*Effects*: +* For each validator successfully checkpointed: + * The number of proofs remaining in the checkpoint is decreased (`checkpoint.proofsRemaining--`) + * A balance delta is calculated using the validator's previous `restakedBalanceGwei`. This delta is added to `checkpoint.balanceDeltasGwei` to track the total beacon chain balance delta. + * The validator's `restakedBalanceGwei` and `lastCheckpointedAt` fields are updated. Additionally, if the proof shows that the validator has a balance of 0, the validator's status is moved to `VALIDATOR_STATUS.WITHDRAWN` and the pod's `activeValidatorCount` is decreased. +* If the checkpoint's `proofsRemaining` drops to 0, the checkpoint is automatically completed: + * `checkpoint.podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei`, rendering it accounted for in future checkpoints + * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp`, and both `_currentCheckpoint` and `currentCheckpointTimestamp` are deleted. + * The Pod Owner's total share delta is calculated as the sum of `checkpoint.podBalanceGwei` and `checkpoint.balanceDeltasGwei`, and forwarded to the `EigenPodManager` (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](TODO)) + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS` +* A checkpoint MUST currently be active (`currentCheckpointTimestamp != 0`) +* `balanceContainerProof` MUST contain a valid merkle proof of the beacon chain's balances container against `_currentCheckpoint.beaconBlockRoot` +* Each `proof` in `proofs` MUST contain a valid merkle proof of the validator's `balanceRoot` against `balanceContainerProof.balanceContainerRoot` + +--- + +### Staleness Proofs + +TODO + +#### `verifyStaleBalance` + +```solidity +function verifyStaleBalance( + uint64 beaconTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.ValidatorProof calldata proof +) + external + onlyWhenNotPaused(PAUSED_START_CHECKPOINT) + onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) +``` + +TODO + +--- + +### Other Methods + +TODO + +#### `stake` + +```solidity +function stake( + bytes calldata pubkey, + bytes calldata signature, + bytes32 depositDataRoot +) + external + payable + onlyEigenPodManager +``` + +TODO + +#### `withdrawRestakedBeaconChainETH` + +```solidity +function withdrawRestakedBeaconChainETH( + address recipient, + uint256 amountWei +) + external + onlyEigenPodManager +``` + +TODO + +#### `recoverTokens` + +```solidity +function recoverTokens( + IERC20[] memory tokenList, + uint256[] memory amountsToWithdraw, + address recipient +) + external + onlyEigenPodOwner + onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) +``` + +TODO + +--- + +### Compatibility with Previous Versions + +Although all `EigenPods` are updated simultaneously via the `BeaconProxy` pattern, previous versions of `EigenPods` have had slightly different state models that need to be accounted for in the latest release. There are two prior major versions of `EigenPod`: +* Pods deployed after M2 mainnet ("M2 Pods") were deployed with `EigenPod.hasRestaked` set to `true`. This is the default behavior for any new `EigenPods`. +* Pods deployed during M1 mainnet ("M1 Pods") were deployed with `EigenPod.hasRestaked` set to `false`. After M2 mainnet, owners of M1 Pods had two options: + * Choose not to "fully upgrade" to an M2 Pod, and continue withdrawing ETH from the pod at will via [`EigenPod.withdrawBeforeRestaking`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v0.2.5-mainnet-m2-minor-eigenpod-upgrade/src/contracts/pods/EigenPod.sol#L403-L406). + * Call [`EigenPod.activateRestaking`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v0.2.5-mainnet-m2-minor-eigenpod-upgrade/src/contracts/pods/EigenPod.sol#L386-L401), setting `EigenPod.hasRestaked` to `true` and performing one final withdrawal of any ETH in the pod. + +Generally, M1 Pods that chose to activate restaking are identical to M2 Pods - so for the sake of clarity, "M1 Pods" will refer to pods that were deployed _before M2_ and _did not call `activateRestaking`_ at any point. + +This latest release brings M1 and M2 pods together, forcing both pods to use the same state model while supporting the original behavior that M1 Pod owners prefer. To clarify, M1 Pod owners have never called `verifyWithdrawalCredentials` for any validators, and have therefore never earned restaking shares for any validators. However, M1 Pod owners are also able to withdraw yield without supplying withdrawal proofs required by M2 Pods. + +There are a few user groups supported by this release. Note that M2 Pod Owners don't need to do anything special and can begin using the new `EigenPod` ABI as-is. + +#### M1 Pod Owners that want to maintain M1 Pod behavior + +#### M1 Pod Owners that want to start restaking now that proofs are cheaper + diff --git a/docs/core/EigenPodManager.md b/docs/core/EigenPodManager.md index a036f9c73..340a363c5 100644 --- a/docs/core/EigenPodManager.md +++ b/docs/core/EigenPodManager.md @@ -1,83 +1,43 @@ ## EigenPodManager - - | File | Type | Proxy | | -------- | -------- | -------- | | [`EigenPodManager.sol`](../../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy | | [`EigenPod.sol`](../../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | -| [`DelayedWithdrawalRouter.sol`](../../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy | -| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS Proxy | - -The `EigenPodManager` and `EigenPod` contracts allow Stakers to restake beacon chain ETH which can then be delegated to Operators via the `DelegationManager`. - -The `EigenPodManager` is the entry point for this process, allowing Stakers to deploy an `EigenPod` and begin restaking. While actively restaking, a Staker uses their `EigenPod` to validate various beacon chain state proofs of validator balance and withdrawal status. When exiting, a Staker uses the `DelegationManager` to undelegate or queue a withdrawal from EigenLayer. -`EigenPods` serve as the withdrawal credentials for one or more beacon chain validators controlled by a Staker. Their primary role is to validate beacon chain proofs for each of the Staker's validators. Beacon chain proofs are used to verify a validator's: -* `EigenPod.verifyWithdrawalCredentials`: withdrawal credentials and effective balance -* `EigenPod.verifyBalanceUpdates`: effective balance (when it changes) -* `EigenPod.verifyAndProcessWithdrawals`: withdrawable epoch, and processed withdrawals within historical block summary +The `EigenPodManager` manages the relationship between a Staker's `EigenPod`, the delegatable shares each Staker holds in the beacon chain ETH strategy, and the withdrawal of those shares via the `DelegationManager`. These functions together support Stakers' ability to restake beacon chain ETH and delegate restaked ETH to Operators in order to earn additional yield. -See [/proofs](./proofs/) for detailed documentation on each of the state proofs used in these methods. Additionally, proofs are checked against a beacon chain block root supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)). +The `EigenPodManager` is the entry point for this process, allowing Stakers to deploy an `EigenPod` and begin restaking. After a Staker deploys their `EigenPod`, the `EigenPodManager` receives various updates from the pod that add or remove shares from the Staker. #### High-level Concepts -The functions of the `EigenPodManager` and `EigenPod` contracts are tightly linked. Rather than writing two separate docs pages, documentation for both contracts is included in this file. This document organizes methods according to the following themes (click each to be taken to the relevant section): +This document organizes methods according to the following themes (click each to be taken to the relevant section): * [Depositing Into EigenLayer](#depositing-into-eigenlayer) -* [Restaking Beacon Chain ETH](#restaking-beacon-chain-eth) * [Withdrawal Processing](#withdrawal-processing) -* [System Configuration](#system-configuration) * [Other Methods](#other-methods) #### Important State Variables -* `EigenPodManager`: - * `mapping(address => IEigenPod) public ownerToPod`: Tracks the deployed `EigenPod` for each Staker - * `mapping(address => int256) public podOwnerShares`: Keeps track of the actively restaked beacon chain ETH for each Staker. - * In some cases, a beacon chain balance update may cause a Staker's balance to drop below zero. This is because when queueing for a withdrawal in the `DelegationManager`, the Staker's current shares are fully removed. If the Staker's beacon chain balance drops after this occurs, their `podOwnerShares` may go negative. This is a temporary change to account for the drop in balance, and is ultimately corrected when the withdrawal is finally processed. - * Since balances on the consensus layer are stored only in Gwei amounts, the EigenPodManager enforces the invariant that `podOwnerShares` is always a whole Gwei amount for every staker, i.e. `podOwnerShares[staker] % 1e9 == 0` always. -* `EigenPod`: - * `_validatorPubkeyHashToInfo[bytes32] -> (ValidatorInfo)`: individual validators are identified within an `EigenPod` according to their public key hash. This mapping keeps track of the following for each validator: - * `validatorStatus`: (`INACTIVE`, `ACTIVE`, `WITHDRAWN`) - * `validatorIndex`: A `uint40` that is unique for each validator making a successful deposit via the deposit contract - * `mostRecentBalanceUpdateTimestamp`: A timestamp that represents the most recent successful proof of the validator's effective balance - * `restakedBalanceGwei`: set to the validator's balance. - * `withdrawableRestakedExecutionLayerGwei`: When a Staker proves that a validator has exited from the beacon chain, the withdrawal amount is added to this variable. When completing a withdrawal of beacon chain ETH, the withdrawal amount is subtracted from this variable. See also: - * [`DelegationManager`: "Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing) - * [`EigenPodManager`: "Withdrawal Processing"](#withdrawal-processing) - -#### Important Definitions - -* "Pod Owner": A Staker who has deployed an `EigenPod` is a Pod Owner. The terms are used interchangeably in this document. - * Pod Owners can only deploy a single `EigenPod`, but can restake any number of beacon chain validators from the same `EigenPod`. - * Pod Owners can delegate their `EigenPodManager` shares to Operators (via `DelegationManager`). - * These shares correspond to the amount of provably-restaked beacon chain ETH held by the Pod Owner via their `EigenPod`. -* `EigenPod`: - * `_podWithdrawalCredentials() -> (bytes memory)`: - * Gives `abi.encodePacked(bytes1(uint8(1)), bytes11(0), address(EigenPod))` - * These are the `0x01` withdrawal credentials of the `EigenPod`, used as a validator's withdrawal credentials on the beacon chain. +* `mapping(address => IEigenPod) public ownerToPod`: Tracks the deployed `EigenPod` for each Staker +* `mapping(address => int256) public podOwnerShares`: Keeps track of the actively restaked beacon chain ETH for each Staker. + * In some cases, a beacon chain balance update may cause a Staker's balance to drop below zero. This is because when queueing for a withdrawal in the `DelegationManager`, the Staker's current shares are fully removed. If the Staker's beacon chain balance drops after this occurs, their `podOwnerShares` may go negative. This is a temporary change to account for the drop in balance, and is ultimately corrected when the withdrawal is finally processed. + * Since balances on the consensus layer are stored only in Gwei amounts, the EigenPodManager enforces the invariant that `podOwnerShares` is always a whole Gwei amount for every staker, i.e. `podOwnerShares[staker] % 1e9 == 0` always. --- ### Depositing Into EigenLayer Before a Staker begins restaking beacon chain ETH, they need to deploy an `EigenPod`, stake, and start a beacon chain validator: -* [`EigenPodManager.createPod`](#eigenpodmanagercreatepod) -* [`EigenPodManager.stake`](#eigenpodmanagerstake) - * [`EigenPod.stake`](#eigenpodstake) +* [`createPod`](#createpod) +* [`stake`](#stake) -To complete the deposit process, the Staker needs to prove that the validator's withdrawal credentials are pointed at the `EigenPod`: -* [`EigenPod.verifyWithdrawalCredentials`](#eigenpodverifywithdrawalcredentials) - -#### `EigenPodManager.createPod` +#### `createPod` ```solidity -function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) +function createPod() + external + onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) + returns (address) ``` Allows a Staker to deploy an `EigenPod` instance, if they have not done so already. @@ -97,10 +57,7 @@ As part of the `EigenPod` deployment process, the Staker is made the Pod Owner, * Caller MUST NOT have deployed an `EigenPod` already * Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -*As of M2*: -* `EigenPods` are initialized with restaking enabled by default (`hasRestaked = true`). Pods deployed before M2 may not have this enabled, and will need to call `EigenPod.activateRestaking()`. - -#### `EigenPodManager.stake` +#### `stake` ```solidity function stake( @@ -117,177 +74,24 @@ Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, provid *Effects*: * Deploys and initializes an `EigenPod` on behalf of Staker, if this has not been done already -* See [`EigenPod.stake`](#eigenpodstake) +* See [`EigenPod.stake`](./EigenPod.md#stake) *Requirements*: * Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -* See [`EigenPod.stake`](#eigenpodstake) - -##### `EigenPod.stake` - -```solidity -function stake( - bytes calldata pubkey, - bytes calldata signature, - bytes32 depositDataRoot -) - external - payable - onlyEigenPodManager -``` - -Handles the call to the beacon chain deposit contract. Only called via `EigenPodManager.stake`. - -*Effects*: -* Deposits 32 ETH into the beacon chain deposit contract, and provides the pod's address as the deposit's withdrawal credentials - -*Requirements*: -* Caller MUST be the `EigenPodManager` -* Call value MUST be 32 ETH -* Deposit contract `deposit` method MUST succeed given the provided `pubkey`, `signature`, and `depositDataRoot` - -#### `EigenPod.verifyWithdrawalCredentials` - -```solidity -function verifyWithdrawalCredentials( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - uint40[] calldata validatorIndices, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - hasEnabledRestaking -``` - -Once a Pod Owner has deposited ETH into the beacon chain deposit contract, they can call this method to "fully restake" one or more validators by proving the validator's withdrawal credentials are pointed at the `EigenPod`. This activation will mean that the ETH in those validators: -* is awarded to the Staker/Pod Owner in `EigenPodManager.podOwnerShares` -* is delegatable to an Operator (via the `DelegationManager`) - -For each successfully proven validator, that validator's status becomes `VALIDATOR_STATUS.ACTIVE`, and the sum of restakable ether across all newly-proven validators is provided to [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate), where it is added to the Pod Owner's shares. If the Pod Owner is delegated to an Operator via the `DelegationManager`, this sum is also added to the Operator's delegated shares for the beacon chain ETH strategy. - -For each validator the Pod Owner wants to verify, the Pod Owner must supply: -* `validatorIndices`: their validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) -* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) -* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root -* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` -* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* For each validator (`_validatorPubkeyHashToInfo[pubkeyHash]`) the validator's info is set for the first time: - * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE` - * `validatorIndex` is recorded - * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root - * `restakedBalanceGwei` is set to the validator's effective balance -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS` -* Pod MUST have enabled restaking -* All input array lengths MUST be equal -* `oracleTimestamp`: - * MUST be greater than or equal to the timestamp of the first slot in the epoch following `mostRecentWithdrawalTimestamp` - * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old - * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* For each validator: - * The validator's status MUST initially be `VALIDATOR_STATUS.INACTIVE` - * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` - * The aforementioned proofs MUST show that the validator's withdrawal credentials are set to the `EigenPod` -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*As of M2*: -* Restaking is enabled by default for pods deployed after M2. See `activateRestaking` for more info. - ---- - -### Restaking Beacon Chain ETH - -At this point, a Staker/Pod Owner has deployed their `EigenPod`, started their beacon chain validator, and proven that its withdrawal credentials are pointed to their `EigenPod`. They are now free to delegate to an Operator (if they have not already), or start up + verify additional beacon chain validators that also withdraw to the same `EigenPod`. - -The primary method concerning actively restaked validators is: -* [`EigenPod.verifyBalanceUpdates`](#eigenpodverifybalanceupdates) - -#### `EigenPod.verifyBalanceUpdates` - -```solidity -function verifyBalanceUpdates( - uint64 oracleTimestamp, - uint40[] calldata validatorIndices, - BeaconChainProofs.StateRootProof calldata stateRootProof, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields -) - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE) -``` - -Anyone (not just the Pod Owner) may call this method with one or more valid balance update proofs to record beacon chain balance updates in one or more of the `EigenPod's` validators. - -A successful balance update proof updates the `EigenPod's` view of a validator's [effective balance](https://eth2book.info/capella/part2/incentives/balances/). If the validator's effective balance has changed, the difference is sent to `EigenPodManager.recordBeaconChainETHBalanceUpdate`, which updates the Pod Owner's shares. If the Pod Owner is delegated to an Operator, this delta is also sent to the `DelegationManager` to update the Operator's delegated beacon chain ETH shares. - -Note that if a validator's effective balance has decreased, this method will result in shares being removed from the Pod Owner in `EigenPodManager.recordBeaconChainETHBalanceUpdate`. This may cause the Pod Owner's balance to go negative in some cases, representing a "deficit" that must be repaid before any withdrawals can be processed. One example flow where this might occur is: -* Pod Owner calls `DelegationManager.undelegate`, which queues a withdrawal in the `DelegationManager`. The Pod Owner's shares are set to 0 while the withdrawal is in the queue. -* Pod Owner's beacon chain ETH balance decreases (maybe due to slashing), and someone provides a proof of this to `EigenPod.verifyBalanceUpdates`. In this case, the Pod Owner will have negative shares in the `EigenPodManager`. -* After a delay, the Pod Owner calls `DelegationManager.completeQueuedWithdrawal`. The negative shares are then repaid out of the withdrawn assets. - -For the validator whose balance should be updated, the caller must supply: -* `validatorIndex`: the validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) -* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root -* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` -* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) -* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* Updates the validator's stored info: - * `restakedBalanceGwei` is updated to the newly-proven effective balance - * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE` -* Balance updates should only be made before a validator has fully exited. If the validator has exited, any further proofs should follow the `verifyAndProcessWithdrawals` path. - * This is to prevent someone from providing a "balance update" on an exited validator that "proves" a balance of 0, when we want to process that update as a withdrawal instead. -* `oracleTimestamp`: - * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old - * MUST be newer than the validator's `mostRecentBalanceUpdateTimestamp` - * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `validatorFields[0]` MUST be a pubkey hash corresponding to a validator whose withdrawal credentials have been proven, and is not yet withdrawn (`VALIDATOR_STATUS.ACTIVE`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) +* See [`EigenPod.stake`](./EigenPod.md#stake) --- ### Withdrawal Processing The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the following method is used: -* [`EigenPodManager.removeShares`](#eigenpodmanagerremoveshares) +* [`removeShares`](#removeshares) When completing a queued undelegation or withdrawal, the `DelegationManager` calls one of these two methods: -* [`EigenPodManager.addShares`](#eigenpodmanageraddshares) -* [`EigenPodManager.withdrawSharesAsTokens`](#eigenpodmanagerwithdrawsharesastokens) - * [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) +* [`addShares`](#addshares) +* [`withdrawSharesAsTokens`](#withdrawsharesastokens) -If a Staker wishes to fully withdraw their beacon chain ETH (via `withdrawSharesAsTokens`), they need to exit their validator and prove the withdrawal *prior to* completing the queued withdrawal. They do so using this method: -* [`EigenPod.verifyAndProcessWithdrawals`](#eigenpodverifyandprocesswithdrawals) - -Some withdrawals are sent to their destination via the `DelayedWithdrawalRouter`: -* [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) -* [`DelayedWithdrawalRouter.claimDelayedWithdrawals`](#delayedwithdrawalrouterclaimdelayedwithdrawals) - -#### `EigenPodManager.removeShares` +#### `removeShares` ```solidity function removeShares( @@ -317,7 +121,7 @@ This method is not allowed to cause the `Staker's` balance to go negative. This * `shares` MUST NOT be greater than `podOwner's` share balance * `shares` MUST be a whole Gwei amount -#### `EigenPodManager.addShares` +#### `addShares` ```solidity function addShares( @@ -347,7 +151,7 @@ If the Pod Owner has a share deficit (negative shares), the deficit is repaid ou * `shares` MUST NOT be negative when converted to an `int256` * `shares` MUST be a whole Gwei amount -#### `EigenPodManager.withdrawSharesAsTokens` +#### `withdrawSharesAsTokens` ```solidity function withdrawSharesAsTokens( @@ -361,9 +165,7 @@ function withdrawSharesAsTokens( The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as tokens (rather than shares). This can be used to "fully exit" some amount of beacon chain ETH and send it to a recipient (via `EigenPod.withdrawRestakedBeaconChainETH`). -Note that because this method entails withdrawing and sending beacon chain ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the beacon chain withdrawals responsible for the ETH should already be proven. - -This means that before completing their queued withdrawal, a Pod Owner needs to prove their beacon chain withdrawals via `EigenPod.verifyAndProcessWithdrawals`. +Note that because this method entails withdrawing and sending beacon chain ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the amount being withdrawn should be accounted for in `EigenPod.withdrawableRestakedExecutionLayerGwei`. This latter condition can be achieved by completing an `EigenPod` checkpoint just prior to completing a queued `DelegationManager` withdrawal (see [EigenPod: Checkpointing Validators](./EigenPod.md#checkpointing-validators) for details). Also note that, like `addShares`, if the original Pod Owner has a share deficit (negative shares), the deficit is repaid out of the withdrawn `shares` before any native ETH is withdrawn. @@ -373,211 +175,20 @@ Also note that, like `addShares`, if the original Pod Owner has a share deficit *Effects*: * If `podOwner's` share balance is negative, `shares` are added until the balance hits 0 - * Any remaining shares are withdrawn and sent to `destination` (see [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth)) + * Any remaining shares are converted 1:1 to ETH and sent to `destination` (see [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth)) *Requirements*: * `podOwner` MUST NOT be zero * `destination` MUST NOT be zero * `shares` MUST NOT be negative when converted to an `int256` * `shares` MUST be a whole Gwei amount -* See [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) - -##### `EigenPod.withdrawRestakedBeaconChainETH` - -```solidity -function withdrawRestakedBeaconChainETH( - address recipient, - uint256 amountWei -) - external - onlyEigenPodManager -``` - -The `EigenPodManager` calls this method when withdrawing a Pod Owner's shares as tokens (native ETH). The input `amountWei` is converted to Gwei and subtracted from `withdrawableRestakedExecutionLayerGwei`, which tracks Gwei that has been provably withdrawn (via `EigenPod.verifyAndProcessWithdrawals`). - -As such: -* If a withdrawal has not been proven that sufficiently raises `withdrawableRestakedExecutionLayerGwei`, this method will revert. -* If the `EigenPod` does not have `amountWei` available to transfer, this method will revert - -*Effects*: -* Decreases the pod's `withdrawableRestakedExecutionLayerGwei` by `amountWei / GWEI_TO_WEI` -* Sends `amountWei` ETH to `recipient` - -*Requirements*: -* `amountWei / GWEI_TO_WEI` MUST NOT be greater than the proven `withdrawableRestakedExecutionLayerGwei` -* Pod MUST have at least `amountWei` ETH balance -* `recipient` MUST NOT revert when transferred `amountWei` -* `amountWei` MUST be a whole Gwei amount - -#### `EigenPod.verifyAndProcessWithdrawals` - -```solidity -function verifyAndProcessWithdrawals( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields, - bytes32[][] calldata withdrawalFields -) - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_WITHDRAWAL) - onlyNotFrozen -``` - -Anyone (not just the Pod Owner) can call this method to prove that one or more validators associated with an `EigenPod` have performed a full or partial withdrawal from the beacon chain. - -Whether each withdrawal is a full or partial withdrawal is determined by the validator's "withdrawable epoch" in the `Validator` container given by `validatorFields` (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)). If the withdrawal proof timestamp is after this epoch, the withdrawal is a full withdrawal. -* Partial withdrawals are performed automatically by the beacon chain when a validator has an effective balance over 32 ETH. This method can be used to prove that these withdrawals occurred, allowing the Pod Owner to withdraw the excess ETH (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)). -* Full withdrawals are performed when a Pod Owner decides to fully exit a validator from the beacon chain. To do this, the Pod Owner should follow these steps: - 1. Undelegate or queue a withdrawal (via the `DelegationManager`: ["Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing)) - 2. Exit their validator from the beacon chain and provide a proof to this method - 3. Complete their withdrawal (via [`DelegationManager.completeQueuedWithdrawal`](./DelegationManager.md#completequeuedwithdrawal)). - -If the Pod Owner only exits their validator, the ETH of the pod owner is still staked through EigenLayer and can be used to service AVSs, even though their ETH has been withdrawn from the beacon chain. The protocol allows for this edge case. - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyWithdrawal`](./proofs/BeaconChainProofs.md#beaconchainproofsverifywithdrawal) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* For each proven withdrawal: - * The validator in question is recorded as having a proven withdrawal at the timestamp given by `withdrawalProof.timestampRoot` - * This is to prevent the same withdrawal from being proven twice - * If this is a full withdrawal: - * Any withdrawal amount in excess of `MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR` is immediately withdrawn (see [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) - * The remainder (`MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR`) must be withdrawn through the `DelegationManager's` withdrawal flow, but in the meantime is added to `EigenPod.withdrawableRestakedExecutionLayerGwei` - * If the amount being withdrawn is not equal to the current accounted-for validator balance, a `shareDelta` is calculated to be sent to ([`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate)). - * The validator's info is updated to reflect its `WITHDRAWN` status, and `restakedBalanceGwei` is set to 0 - * If this is a partial withdrawal: - * The withdrawal amount is added to `sumOfPartialWithdrawalsClaimedGwei` - * The withdrawal amount is withdrawn (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_WITHDRAWAL` -* All input array lengths MUST be equal -* `oracleTimestamp` MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* For each withdrawal being proven: - * The time of the withdrawal (`withdrawalProof.timestampRoot`) must be AFTER the `EigenPod's` `mostRecentWithdrawalTimestamp` - * The validator MUST be in either status: `ACTIVE` or `WITHDRAWN` - * `WITHDRAWN` is permitted because technically, it's possible to deposit additional ETH into an exited validator and have the ETH be auto-withdrawn. - * If the withdrawal is a full withdrawal, only `ACTIVE` is permitted - * The validator MUST NOT have already proven a withdrawal at the `withdrawalProof.timestampRoot` - * `BeaconChainProofs.verifyWithdrawal` MUST verify the provided `withdrawalFields` against the provided `beaconStateRoot` - * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` - -#### `DelayedWithdrawalRouter.createDelayedWithdrawal` - -```solidity -function createDelayedWithdrawal( - address podOwner, - address recipient -) - external - payable - onlyEigenPod(podOwner) - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) -``` - -Used by `EigenPods` to queue a withdrawal of beacon chain ETH that can be claimed by a `recipient` after `withdrawalDelayBlocks` have passed. - -*Effects*: -* Creates a `DelayedWithdrawal` for the `recipient` in the amount of `msg.value`, starting at the current block - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` -* Caller MUST be the `EigenPod` associated with the `podOwner` -* `recipient` MUST NOT be zero - -#### `DelayedWithdrawalRouter.claimDelayedWithdrawals` - -```solidity -function claimDelayedWithdrawals( - address recipient, - uint256 maxNumberOfDelayedWithdrawalsToClaim -) - external - nonReentrant - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) - -// (Uses `msg.sender` as `recipient`) -function claimDelayedWithdrawals( - uint256 maxNumberOfDelayedWithdrawalsToClaim -) - external - nonReentrant - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) -``` - -After `withdrawalDelayBlocks`, withdrawals can be claimed using these methods. Claims may be processed on behalf of someone else by passing their address in as the `recipient`. Otherwise, claims are processed on behalf of `msg.sender`. - -This method loops over up to `maxNumberOfDelayedWithdrawalsToClaim` withdrawals, tallys each withdrawal amount, and sends the total to the `recipient`. - -*Effects*: -* Updates the `recipient's` `delayedWithdrawalsCompleted` -* Sends ETH from completed withdrawals to the `recipient` - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` - ---- - -### System Configuration - -* [`EigenPodManager.updateBeaconChainOracle`](#eigenpodmanagerupdatebeaconchainoracle) -* [`DelayedWithdrawalRouter.setWithdrawalDelayBlocks`](#delayedwithdrawalroutersetwithdrawaldelayblocks) - -#### `EigenPodManager.updateBeaconChainOracle` - -```solidity -function updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) external onlyOwner -``` - -Allows the owner to update the address of the oracle used by `EigenPods` to retrieve beacon chain state roots (used when verifying beacon chain state proofs). - -*Effects*: -* Updates `EigenPodManager.beaconChainOracle` - -*Requirements*: -* Caller MUST be the owner - -#### `DelayedWithdrawalRouter.setWithdrawalDelayBlocks` - -```solidity -function setWithdrawalDelayBlocks(uint256 newValue) external onlyOwner -``` - -Allows the `DelayedWithdrawalRouter` to update the delay between withdrawal creation and claimability. - -The new delay can't exceed `MAX_WITHDRAWAL_DELAY_BLOCKS`. - -*Effects*: -* Updates `DelayedWithdrawalRouter.withdrawalDelayBlocks` - -*Requirements*: -* Caller MUST be the owner -* `newValue` MUST NOT be greater than `MAX_WITHDRAWAL_DELAY_BLOCKS` +* See [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth) --- ### Other Methods -This section details various methods that don't fit well into other sections. - -Stakers' balance updates are accounted for when the Staker's `EigenPod` calls this method: -* [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*For pods deployed prior to M2*, the following methods are callable: -* [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) -* [`EigenPod.withdrawBeforeRestaking`](#eigenpodwithdrawbeforerestaking) - -The `EigenPod` also includes two token recovery mechanisms: -* [`EigenPod.withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei) -* [`EigenPod.recoverTokens`](#eigenpodrecovertokens) - -#### `EigenPodManager.recordBeaconChainETHBalanceUpdate` +#### `recordBeaconChainETHBalanceUpdate` ```solidity function recordBeaconChainETHBalanceUpdate( @@ -589,130 +200,25 @@ function recordBeaconChainETHBalanceUpdate( nonReentrant ``` -This method is called by an `EigenPod` during a balance update or withdrawal. It accepts a positive or negative `sharesDelta`, which is added/subtracted against the Pod Owner's shares. +This method is called by an `EigenPod` to report a change in its Pod Owner's shares. It accepts a positive or negative `sharesDelta`, which is added/subtracted against the Pod Owner's shares. The delta is also communicated to the `DelegationManager`, which updates the number of shares the Pod Owner has delegated to an Operator. + +Note that this method _may_ result in a Pod Owner's shares going negative. This can occur when: +* The Pod Owner has queued a withdrawal for all their Beacon Chain ETH shares via `DelegationManager.queueWithdrawals` + * This will set the `EigenPodManager.podOwnerShares[podOwner]` to 0 +* The Pod Owner's pod reports a negative delta, perhaps due to the Pod Owner getting slashed on the beacon chain. -If the Pod Owner is not in undelegation limbo and is delegated to an Operator, the `sharesDelta` is also sent to the `DelegationManager` to either increase or decrease the Operator's delegated shares. +In this case, the Pod Owner's `podOwnerShares` will go negative. *Entry Points*: * `EigenPod.verifyWithdrawalCredentials` -* `EigenPod.verifyBalanceUpdates` -* `EigenPod.verifyAndProcessWithdrawals` +* `EigenPod.startCheckpoint` +* `EigenPod.verifyCheckpointProofs` *Effects*: * Adds or removes `sharesDelta` from the Pod Owner's shares -* If the Pod Owner is NOT in undelegation limbo: - * If `sharesDelta` is negative: see [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares) - * If `sharesDelta` is positive: see [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) +* If `sharesDelta` is negative: see [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares) +* If `sharesDelta` is positive: see [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) *Requirements*: * Caller MUST be the `EigenPod` associated with the passed-in `podOwner` -* `sharesDelta`: - * MUST NOT be 0 - * If negative, `sharesDelta` MUST NOT remove more shares than the Pod Owner has - * MUST be a whole Gwei amount - -#### `EigenPod.activateRestaking` - -```solidity -function activateRestaking() - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - onlyEigenPodOwner - hasNeverRestaked -``` - -Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. - -`activateRestaking` allows a Pod Owner to designate their pod (and any future ETH sent to it) as being restaked. Calling this method first withdraws any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, and then prevents further calls to `withdrawBeforeRestaking`. - -Withdrawing any future ETH sent via beacon chain withdrawal to the `EigenPod` requires providing beacon chain state proofs. However, ETH sent to the pod's `receive` function should be withdrawable without proofs (see [`withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei)). - -*Effects*: -* Sets `hasRestaked = true` -* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) -* Updates the pod's most recent withdrawal timestamp to the current time -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -* Pod MUST NOT have already activated restaking -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*As of M2*: restaking is automatically activated for newly-deployed `EigenPods` (`hasRestaked = true`). However, for `EigenPods` deployed *before* M2, restaking may not be active (unless the Pod Owner has called this method). - -#### `EigenPod.withdrawBeforeRestaking` - -```solidity -function withdrawBeforeRestaking() - external - onlyEigenPodOwner - hasNeverRestaked -``` - -Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. - -Allows the Pod Owner to withdraw any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, assuming restaking has not yet been activated. See [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) for more details. - -*Effects*: -* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) -* Updates the pod's most recent withdrawal timestamp to the current time -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pod MUST NOT have already activated restaking -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*As of M2*: restaking is automatically activated for newly-deployed `EigenPods`, making this method uncallable for pods deployed after M2. However, for `EigenPods` deployed *before* M2, restaking may not be active, and this method may be callable. - -#### `EigenPod.withdrawNonBeaconChainETHBalanceWei` - -```solidity -function withdrawNonBeaconChainETHBalanceWei( - address recipient, - uint256 amountToWithdraw -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) -``` - -Allows the Pod Owner to withdraw ETH accidentally sent to the contract's `receive` function. - -The `receive` function updates `nonBeaconChainETHBalanceWei`, which this function uses to calculate how much can be withdrawn. - -Withdrawals from this function are sent via the `DelayedWithdrawalRouter`, and can be claimed by the passed-in `recipient`. - -*Effects:* -* Decrements `nonBeaconChainETHBalanceWei` -* Sends `amountToWithdraw` wei to [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements:* -* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` -* Caller MUST be the Pod Owner -* `amountToWithdraw` MUST NOT be greater than the amount sent to the contract's `receive` function -* See [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) - -#### `EigenPod.recoverTokens` - -```solidity -function recoverTokens( - IERC20[] memory tokenList, - uint256[] memory amountsToWithdraw, - address recipient -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) -``` - -Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`. - -*Effects:* -* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient` - -*Requirements:* -* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` -* `tokenList` and `amountsToWithdraw` MUST have equal lengths -* Caller MUST be the Pod Owner +* `sharesDelta` MUST be a whole Gwei amount diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 2bc8456cb..ccff80197 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620049d1380380620049d1833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147b36200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612fb9015260008181610483015261113701526147b36000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613afb565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613bb9565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c87565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613ce3565b610e12565b6040516101d99190613d5c565b34801561041957600080fd5b5061042d610428366004613d6a565b610e77565b6040516101d99190613d83565b34801561044657600080fd5b50610400610455366004613d6a565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dd9565b610f24565b6101a36104d3366004613df6565b611061565b3480156104e457600080fd5b5061042d6104f3366004613ce3565b61120e565b34801561050457600080fd5b506101a3610513366004613e89565b611301565b34801561052457600080fd5b506101a3610533366004613eb5565b61153e565b34801561054457600080fd5b506101a3610553366004613fa6565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614077565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140df565b1561067e5760405162461bcd60e51b8152600401610675906140fc565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140df565b156107275760405162461bcd60e51b8152600401610675906140fc565b600061076d6107368580614159565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d24565b60028111156107ed576107ed613d24565b8152505090506212750081604001516001600160401b031661080f91906141b8565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d24565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b8680614159565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c9792505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611cc1565b87611e77565b610a0b86356109f78780614159565b610a0460208a018a6141d0565b8651611fd2565b610a1560006121e9565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140df565b15610af15760405162461bcd60e51b8152600401610675906140fc565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611cc1565b89611e77565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe61425e565b9050602002016020810190610d139190614274565b8a8a86818110610d2557610d2561425e565b9050602002810190610d3791906141d0565b8a8a88818110610d4957610d4961425e565b9050602002810190610d5b9190614159565b61246b565b610d6a90836141b8565b915080610d768161429b565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b992505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d24565b6002811115610f1b57610f1b613d24565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140df565b15610ff75760405162461bcd60e51b8152600401610675906140fc565b611000826121e9565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b8152600401610675906142b6565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612ab3565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061438c565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143db565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b992505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d24565b60028111156112f7576112f7613d24565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b8152600401610675906142b6565b611357633b9aca0082614405565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca0083614419565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b031661442d565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612af8565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b815260040161067590614216565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140df565b156117e85760405162461bcd60e51b8152600401610675906140fc565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf838583815181106118955761189561425e565b60200260200101518784815181106118af576118af61425e565b60200260200101516001600160a01b0316612b029092919063ffffffff16565b806118d98161429b565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140df565b156119915760405162461bcd60e51b8152600401610675906140fc565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612b54565b6000805b85811015611c1957600060366000898985818110611ab157611ab161425e565b9050602002810190611ac39190614455565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611b3157611b31613d24565b6002811115611b4257611b42613d24565b9052509050600181606001516002811115611b5f57611b5f613d24565b14611b6a5750611c07565b846001600160401b031681604001516001600160401b031610611b8d5750611c07565b600080611bc083888d358d8d89818110611ba957611ba961425e565b9050602002810190611bbb9190614455565b612cd0565b602088018051929450909250611bd582614475565b62ffffff16905250606086018051839190611bf1908390614494565b600f0b905250611c0181866144e3565b94505050505b80611c118161429b565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611c46918591166144e3565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612ed6565b600081600081518110611c8857611c8861425e565b60200260200101519050919050565b600081600381518110611cac57611cac61425e565b60200260200101516000801b14159050919050565b6000611cd0611fff600c61450e565b611ce36001600160401b0384164261452d565b10611d4d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611d9591614544565b600060405180830381855afa9150503d8060008114611dd0576040519150601f19603f3d011682016040523d82523d6000602084013e611dd5565b606091505b5091509150818015611de8575060008151115b15611e095780806020019051810190611e019190614556565b949350505050565b60405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b611e836003602061450e565b611e9060208301836141d0565b905014611f055760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611f55611f1560208301836141d0565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130dd565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b6008841461204d5760405162461bcd60e51b815260206004820152604e602482015260008051602061475e83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561205b602860016141b8565b61206591906141b8565b61207090602061450e565b82146120de5760405162461bcd60e51b8152602060048201526043602482015260008051602061475e83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061211c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130f592505050565b9050600064ffffffffff8316612134602860016141b8565b600b901b17905061217f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130dd565b6121df5760405162461bcd60e51b815260206004820152603d602482015260008051602061475e83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b03161561228a5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561230f5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661232c633b9aca0047614419565b612336919061442d565b905081801561234c57506001600160401b038116155b156123bf5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b600060405180608001604052806123d542611cc1565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061243081612ed6565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124aa848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561251957612519613d24565b600281111561252a5761252a613d24565b905250905060008160600151600281111561254757612547613d24565b146125ea5760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126308686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a292505050565b6001600160401b0316146126ba5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b6126c2612ab3565b6126cb9061456f565b6127078686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c792505050565b146127885760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006127c68686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133dc92505050565b90506127d68a87878b8b8e611fd2565b603980549060006127e68361429b565b9091555050603a54600090600160401b90046001600160401b03161561281e57603a54600160401b90046001600160401b031661282b565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561290157612901613d24565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16129a9633b9aca006001600160401b03841661450e565b9c9b505050505050505050505050565b60008151603014612a425760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612a59908490600090602001614593565b60408051601f1981840301815290829052612a7391614544565b602060405180830381855afa158015612a90573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614556565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133f4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261153990849061350d565b612b60600560036141b8565b612b6b90602061450e565b612b7860208301836141d0565b905014612bfb5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612c4c612c0d60208401846141d0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130dd565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612ce88784886135df565b9050816001600160401b0316816001600160401b031614612d6257612d0d8183613756565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612de65760398054906000612d90836145c2565b9091555050600260608a0152612da5856145d9565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612e8657612e86613d24565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff1661305d576000633b9aca00826060015183604001516001600160401b0316612f089190614494565b600f0b612f159190614600565b6040830151603480549293509091600090612f3a9084906001600160401b03166144e3565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fff57600080fd5b505af1158015613013573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130eb86858561376e565b1495945050505050565b600080600283516131069190614419565b90506000816001600160401b0381111561312257613122613ed2565b60405190808252806020026020018201604052801561314b578160200160208202803683370190505b50905060005b8281101561325257600285613166838361450e565b815181106131765761317661425e565b60200260200101518683600261318c919061450e565b6131979060016141b8565b815181106131a7576131a761425e565b60200260200101516040516020016131c9929190918252602082015260400190565b60408051601f19818403018152908290526131e391614544565b602060405180830381855afa158015613200573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132239190614556565b8282815181106132355761323561425e565b60209081029190910101528061324a8161429b565b915050613151565b5061325e600283614419565b91505b811561337e5760005b8281101561336b5760028261327f838361450e565b8151811061328f5761328f61425e565b6020026020010151838360026132a5919061450e565b6132b09060016141b8565b815181106132c0576132c061425e565b60200260200101516040516020016132e2929190918252602082015260400190565b60408051601f19818403018152908290526132fc91614544565b602060405180830381855afa158015613319573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061333c9190614556565b82828151811061334e5761334e61425e565b6020908102919091010152806133638161429b565b91505061326a565b50613377600283614419565b9150613261565b806000815181106133915761339161425e565b602002602001015192505050919050565b6000610e71826006815181106133ba576133ba61425e565b60200260200101516138ba565b600081600181518110611c8857611c8861425e565b6000610e71826002815181106133ba576133ba61425e565b804710156134445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613491576040519150601f19603f3d011682016040523d82523d6000602084013e613496565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613562826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139219092919063ffffffff16565b805190915015611539578080602001905181019061358091906140df565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ed602660016141b8565b6135f890602061450e565b61360560408401846141d0565b9050146136765760405162461bcd60e51b81526020600482015260446024820181905260008051602061475e833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613683600485614685565b64ffffffffff1690506136dd61369c60408501856141d0565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130dd565b61373d5760405162461bcd60e51b815260206004820152603e602482015260008051602061475e83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61374b836020013585613930565b9150505b9392505050565b600061374f6001600160401b038084169085166146a9565b6000835160001415801561378d57506020845161378b9190614405565b155b61381c5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b855181116138b057613840600285614405565b613873578151600052808601516020526020826040600060026107d05a03fa61386857600080fd5b60028404935061389e565b8086015160005281516020526020826040600060026107d05a03fa61389757600080fd5b6002840493505b6138a96020826141b8565b905061382d565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e01848460008561395d565b60008061393e6004846146f9565b61394990604061471d565b64ffffffffff169050611e0184821b6138ba565b6060824710156139be5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b613a155760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a319190614544565b60006040518083038185875af1925050503d8060008114613a6e576040519150601f19603f3d011682016040523d82523d6000602084013e613a73565b606091505b5091509150613a83828286613a8e565b979650505050505050565b60608315613a9d57508161374f565b825115613aad5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061474a565b80356001600160401b0381168114613ade57600080fd5b919050565b600060408284031215613af557600080fd5b50919050565b600080600060608486031215613b1057600080fd5b613b1984613ac7565b925060208401356001600160401b0380821115613b3557600080fd5b613b4187838801613ae3565b93506040860135915080821115613b5757600080fd5b50613b6486828701613ae3565b9150509250925092565b60008083601f840112613b8057600080fd5b5081356001600160401b03811115613b9757600080fd5b6020830191508360208260051b8501011115613bb257600080fd5b9250929050565b60008060008060008060008060a0898b031215613bd557600080fd5b613bde89613ac7565b975060208901356001600160401b0380821115613bfa57600080fd5b613c068c838d01613ae3565b985060408b0135915080821115613c1c57600080fd5b613c288c838d01613b6e565b909850965060608b0135915080821115613c4157600080fd5b613c4d8c838d01613b6e565b909650945060808b0135915080821115613c6657600080fd5b50613c738b828c01613b6e565b999c989b5096995094979396929594505050565b600060208284031215613c9957600080fd5b61374f82613ac7565b60008083601f840112613cb457600080fd5b5081356001600160401b03811115613ccb57600080fd5b602083019150836020828501011115613bb257600080fd5b60008060208385031215613cf657600080fd5b82356001600160401b03811115613d0c57600080fd5b613d1885828601613ca2565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d5857634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d3a565b600060208284031215613d7c57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613dc46060840182613d3a565b5092915050565b80151581146130da57600080fd5b600060208284031215613deb57600080fd5b813561374f81613dcb565b600080600080600060608688031215613e0e57600080fd5b85356001600160401b0380821115613e2557600080fd5b613e3189838a01613ca2565b90975095506020880135915080821115613e4a57600080fd5b50613e5788828901613ca2565b96999598509660400135949350505050565b6001600160a01b03811681146130da57600080fd5b8035613ade81613e69565b60008060408385031215613e9c57600080fd5b8235613ea781613e69565b946020939093013593505050565b600060208284031215613ec757600080fd5b813561374f81613e69565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f1057613f10613ed2565b604052919050565b60006001600160401b03821115613f3157613f31613ed2565b5060051b60200190565b600082601f830112613f4c57600080fd5b81356020613f61613f5c83613f18565b613ee8565b82815260059290921b84018101918181019086841115613f8057600080fd5b8286015b84811015613f9b5780358352918301918301613f84565b509695505050505050565b600080600060608486031215613fbb57600080fd5b83356001600160401b0380821115613fd257600080fd5b818601915086601f830112613fe657600080fd5b81356020613ff6613f5c83613f18565b82815260059290921b8401810191818101908a84111561401557600080fd5b948201945b8386101561403c57853561402d81613e69565b8252948201949082019061401a565b9750508701359250508082111561405257600080fd5b5061405f86828701613f3b565b92505061406e60408501613e7e565b90509250925092565b60008060006040848603121561408c57600080fd5b83356001600160401b03808211156140a357600080fd5b6140af87838801613ae3565b945060208601359150808211156140c557600080fd5b506140d286828701613b6e565b9497909650939450505050565b6000602082840312156140f157600080fd5b815161374f81613dcb565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261417057600080fd5b8301803591506001600160401b0382111561418a57600080fd5b6020019150600581901b3603821315613bb257600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141cb576141cb6141a2565b500190565b6000808335601e198436030181126141e757600080fd5b8301803591506001600160401b0382111561420157600080fd5b602001915036819003821315613bb257600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561428657600080fd5b813564ffffffffff8116811461374f57600080fd5b60006000198214156142af576142af6141a2565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561434b578181015183820152602001614333565b8381111561435a576000848401525b50505050565b60008151808452614378816020860160208601614330565b601f01601f19169290920160200192915050565b6080815260006143a060808301888a614307565b82810360208401526143b28188614360565b905082810360408401526143c7818688614307565b915050826060830152979650505050505050565b602081526000611e01602083018486614307565b634e487b7160e01b600052601260045260246000fd5b600082614414576144146143ef565b500690565b600082614428576144286143ef565b500490565b60006001600160401b038381169083168181101561444d5761444d6141a2565b039392505050565b60008235605e1983360301811261446b57600080fd5b9190910192915050565b600062ffffff82168061448a5761448a6141a2565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144be576144be6141a2565b8260016001607f1b03190382128116156144da576144da6141a2565b50019392505050565b60006001600160401b03808316818516808303821115614505576145056141a2565b01949350505050565b6000816000190483118215151615614528576145286141a2565b500290565b60008282101561453f5761453f6141a2565b500390565b6000825161446b818460208701614330565b60006020828403121561456857600080fd5b5051919050565b80516020808301519190811015613af55760001960209190910360031b1b16919050565b600083516145a5818460208801614330565b6001600160801b0319939093169190920190815260100192915050565b6000816145d1576145d16141a2565b506000190190565b600081600f0b60016001607f1b03198114156145f7576145f76141a2565b60000392915050565b60006001600160ff1b0381841382841380821686840486111615614626576146266141a2565b600160ff1b6000871282811687830589121615614645576146456141a2565b60008712925087820587128484161615614661576146616141a2565b87850587128184161615614677576146776141a2565b505050929093029392505050565b600064ffffffffff8084168061469d5761469d6143ef565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146d4576146d46141a2565b8160016001607f1b030183138116156146ef576146ef6141a2565b5090039392505050565b600064ffffffffff80841680614711576147116143ef565b92169190910692915050565b600064ffffffffff80831681851681830481118215151615614741576147416141a2565b02949350505050565b60208152600061374f602083018461436056fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220125218a8c329c9b9f3802bb5717f96d1f9bdf5f76bd9e7ff7ad25795cc3cb1c064736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b50604051620049d0380380620049d0833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147b26200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612fb8015260008181610483015261113701526147b26000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613afa565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613bb8565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c86565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613ce2565b610e12565b6040516101d99190613d5b565b34801561041957600080fd5b5061042d610428366004613d69565b610e77565b6040516101d99190613d82565b34801561044657600080fd5b50610400610455366004613d69565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dd8565b610f24565b6101a36104d3366004613df5565b611061565b3480156104e457600080fd5b5061042d6104f3366004613ce2565b61120e565b34801561050457600080fd5b506101a3610513366004613e88565b611301565b34801561052457600080fd5b506101a3610533366004613eb4565b61153e565b34801561054457600080fd5b506101a3610553366004613fa5565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614076565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140de565b1561067e5760405162461bcd60e51b8152600401610675906140fb565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140de565b156107275760405162461bcd60e51b8152600401610675906140fb565b600061076d6107368580614158565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d23565b60028111156107ed576107ed613d23565b8152505090506212750081604001516001600160401b031661080f91906141b7565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d23565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b8680614158565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c9792505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611cc1565b87611e76565b610a0b86356109f78780614158565b610a0460208a018a6141cf565b8651611fd1565b610a1560006121e8565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140de565b15610af15760405162461bcd60e51b8152600401610675906140fb565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611cc1565b89611e76565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe61425d565b9050602002016020810190610d139190614273565b8a8a86818110610d2557610d2561425d565b9050602002810190610d3791906141cf565b8a8a88818110610d4957610d4961425d565b9050602002810190610d5b9190614158565b61246a565b610d6a90836141b7565b915080610d768161429a565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d23565b6002811115610f1b57610f1b613d23565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140de565b15610ff75760405162461bcd60e51b8152600401610675906140fb565b611000826121e8565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b8152600401610675906142b5565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612ab2565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061438b565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143da565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d23565b60028111156112f7576112f7613d23565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b8152600401610675906142b5565b611357633b9aca0082614404565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca0083614418565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b031661442c565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612af7565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140de565b156117e85760405162461bcd60e51b8152600401610675906140fb565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf838583815181106118955761189561425d565b60200260200101518784815181106118af576118af61425d565b60200260200101516001600160a01b0316612b019092919063ffffffff16565b806118d98161429a565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140de565b156119915760405162461bcd60e51b8152600401610675906140fb565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612b53565b6000805b85811015611c1957600060366000898985818110611ab157611ab161425d565b9050602002810190611ac39190614454565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611b3157611b31613d23565b6002811115611b4257611b42613d23565b9052509050600181606001516002811115611b5f57611b5f613d23565b14611b6a5750611c07565b846001600160401b031681604001516001600160401b031610611b8d5750611c07565b600080611bc083888d358d8d89818110611ba957611ba961425d565b9050602002810190611bbb9190614454565b612ccf565b602088018051929450909250611bd582614474565b62ffffff16905250606086018051839190611bf1908390614493565b600f0b905250611c0181866144e2565b94505050505b80611c118161429a565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611c46918591166144e2565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612ed5565b600081600081518110611c8857611c8861425d565b60200260200101519050919050565b600081600381518110611cac57611cac61425d565b60200260200101516000801b14159050919050565b6000611cd0611fff600c61450d565b611ce36001600160401b0384164261452c565b10611d4d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611d9591614543565b600060405180830381855afa9150503d8060008114611dd0576040519150601f19603f3d011682016040523d82523d6000602084013e611dd5565b606091505b5091509150818015611de8575060008151115b611e5a5760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611e6e9190614555565b949350505050565b611e826003602061450d565b611e8f60208301836141cf565b905014611f045760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611f54611f1460208301836141cf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130dc565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b6008841461204c5760405162461bcd60e51b815260206004820152604e602482015260008051602061475d83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561205a602860016141b7565b61206491906141b7565b61206f90602061450d565b82146120dd5760405162461bcd60e51b8152602060048201526043602482015260008051602061475d83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061211b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130f492505050565b9050600064ffffffffff8316612133602860016141b7565b600b901b17905061217e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130dc565b6121de5760405162461bcd60e51b815260206004820152603d602482015260008051602061475d83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156122895760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561230e5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661232b633b9aca0047614418565b612335919061442c565b905081801561234b57506001600160401b038116155b156123be5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b600060405180608001604052806123d442611cc1565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061242f81612ed5565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124a9848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561251857612518613d23565b600281111561252957612529613d23565b905250905060008160600151600281111561254657612546613d23565b146125e95760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b03801661262f8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a192505050565b6001600160401b0316146126b95760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b6126c1612ab2565b6126ca9061456e565b6127068686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c692505050565b146127875760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006127c58686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133db92505050565b90506127d58a87878b8b8e611fd1565b603980549060006127e58361429a565b9091555050603a54600090600160401b90046001600160401b03161561281d57603a54600160401b90046001600160401b031661282a565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561290057612900613d23565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16129a8633b9aca006001600160401b03841661450d565b9c9b505050505050505050505050565b60008151603014612a415760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612a58908490600090602001614592565b60408051601f1981840301815290829052612a7291614543565b602060405180830381855afa158015612a8f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614555565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133f3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261153990849061350c565b612b5f600560036141b7565b612b6a90602061450d565b612b7760208301836141cf565b905014612bfa5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612c4b612c0c60208401846141cf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130dc565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612ce78784886135de565b9050816001600160401b0316816001600160401b031614612d6157612d0c8183613755565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612de55760398054906000612d8f836145c1565b9091555050600260608a0152612da4856145d8565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612e8557612e85613d23565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff1661305c576000633b9aca00826060015183604001516001600160401b0316612f079190614493565b600f0b612f1491906145ff565b6040830151603480549293509091600090612f399084906001600160401b03166144e2565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612ffe57600080fd5b505af1158015613012573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130ea86858561376d565b1495945050505050565b600080600283516131059190614418565b90506000816001600160401b0381111561312157613121613ed1565b60405190808252806020026020018201604052801561314a578160200160208202803683370190505b50905060005b8281101561325157600285613165838361450d565b815181106131755761317561425d565b60200260200101518683600261318b919061450d565b6131969060016141b7565b815181106131a6576131a661425d565b60200260200101516040516020016131c8929190918252602082015260400190565b60408051601f19818403018152908290526131e291614543565b602060405180830381855afa1580156131ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132229190614555565b8282815181106132345761323461425d565b6020908102919091010152806132498161429a565b915050613150565b5061325d600283614418565b91505b811561337d5760005b8281101561336a5760028261327e838361450d565b8151811061328e5761328e61425d565b6020026020010151838360026132a4919061450d565b6132af9060016141b7565b815181106132bf576132bf61425d565b60200260200101516040516020016132e1929190918252602082015260400190565b60408051601f19818403018152908290526132fb91614543565b602060405180830381855afa158015613318573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061333b9190614555565b82828151811061334d5761334d61425d565b6020908102919091010152806133628161429a565b915050613269565b50613376600283614418565b9150613260565b806000815181106133905761339061425d565b602002602001015192505050919050565b6000610e71826006815181106133b9576133b961425d565b60200260200101516138b9565b600081600181518110611c8857611c8861425d565b6000610e71826002815181106133b9576133b961425d565b804710156134435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613490576040519150601f19603f3d011682016040523d82523d6000602084013e613495565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139209092919063ffffffff16565b805190915015611539578080602001905181019061357f91906140de565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ec602660016141b7565b6135f790602061450d565b61360460408401846141cf565b9050146136755760405162461bcd60e51b81526020600482015260446024820181905260008051602061475d833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613682600485614684565b64ffffffffff1690506136dc61369b60408501856141cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130dc565b61373c5760405162461bcd60e51b815260206004820152603e602482015260008051602061475d83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61374a83602001358561392f565b9150505b9392505050565b600061374e6001600160401b038084169085166146a8565b6000835160001415801561378c57506020845161378a9190614404565b155b61381b5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b855181116138af5761383f600285614404565b613872578151600052808601516020526020826040600060026107d05a03fa61386757600080fd5b60028404935061389d565b8086015160005281516020526020826040600060026107d05a03fa61389657600080fd5b6002840493505b6138a86020826141b7565b905061382c565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e6e848460008561395c565b60008061393d6004846146f8565b61394890604061471c565b64ffffffffff169050611e6e84821b6138b9565b6060824710156139bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b613a145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a309190614543565b60006040518083038185875af1925050503d8060008114613a6d576040519150601f19603f3d011682016040523d82523d6000602084013e613a72565b606091505b5091509150613a82828286613a8d565b979650505050505050565b60608315613a9c57508161374e565b825115613aac5782518084602001fd5b8160405162461bcd60e51b81526004016106759190614749565b80356001600160401b0381168114613add57600080fd5b919050565b600060408284031215613af457600080fd5b50919050565b600080600060608486031215613b0f57600080fd5b613b1884613ac6565b925060208401356001600160401b0380821115613b3457600080fd5b613b4087838801613ae2565b93506040860135915080821115613b5657600080fd5b50613b6386828701613ae2565b9150509250925092565b60008083601f840112613b7f57600080fd5b5081356001600160401b03811115613b9657600080fd5b6020830191508360208260051b8501011115613bb157600080fd5b9250929050565b60008060008060008060008060a0898b031215613bd457600080fd5b613bdd89613ac6565b975060208901356001600160401b0380821115613bf957600080fd5b613c058c838d01613ae2565b985060408b0135915080821115613c1b57600080fd5b613c278c838d01613b6d565b909850965060608b0135915080821115613c4057600080fd5b613c4c8c838d01613b6d565b909650945060808b0135915080821115613c6557600080fd5b50613c728b828c01613b6d565b999c989b5096995094979396929594505050565b600060208284031215613c9857600080fd5b61374e82613ac6565b60008083601f840112613cb357600080fd5b5081356001600160401b03811115613cca57600080fd5b602083019150836020828501011115613bb157600080fd5b60008060208385031215613cf557600080fd5b82356001600160401b03811115613d0b57600080fd5b613d1785828601613ca1565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d5757634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d39565b600060208284031215613d7b57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613dc36060840182613d39565b5092915050565b80151581146130d957600080fd5b600060208284031215613dea57600080fd5b813561374e81613dca565b600080600080600060608688031215613e0d57600080fd5b85356001600160401b0380821115613e2457600080fd5b613e3089838a01613ca1565b90975095506020880135915080821115613e4957600080fd5b50613e5688828901613ca1565b96999598509660400135949350505050565b6001600160a01b03811681146130d957600080fd5b8035613add81613e68565b60008060408385031215613e9b57600080fd5b8235613ea681613e68565b946020939093013593505050565b600060208284031215613ec657600080fd5b813561374e81613e68565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f0f57613f0f613ed1565b604052919050565b60006001600160401b03821115613f3057613f30613ed1565b5060051b60200190565b600082601f830112613f4b57600080fd5b81356020613f60613f5b83613f17565b613ee7565b82815260059290921b84018101918181019086841115613f7f57600080fd5b8286015b84811015613f9a5780358352918301918301613f83565b509695505050505050565b600080600060608486031215613fba57600080fd5b83356001600160401b0380821115613fd157600080fd5b818601915086601f830112613fe557600080fd5b81356020613ff5613f5b83613f17565b82815260059290921b8401810191818101908a84111561401457600080fd5b948201945b8386101561403b57853561402c81613e68565b82529482019490820190614019565b9750508701359250508082111561405157600080fd5b5061405e86828701613f3a565b92505061406d60408501613e7d565b90509250925092565b60008060006040848603121561408b57600080fd5b83356001600160401b03808211156140a257600080fd5b6140ae87838801613ae2565b945060208601359150808211156140c457600080fd5b506140d186828701613b6d565b9497909650939450505050565b6000602082840312156140f057600080fd5b815161374e81613dca565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261416f57600080fd5b8301803591506001600160401b0382111561418957600080fd5b6020019150600581901b3603821315613bb157600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ca576141ca6141a1565b500190565b6000808335601e198436030181126141e657600080fd5b8301803591506001600160401b0382111561420057600080fd5b602001915036819003821315613bb157600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561428557600080fd5b813564ffffffffff8116811461374e57600080fd5b60006000198214156142ae576142ae6141a1565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561434a578181015183820152602001614332565b83811115614359576000848401525b50505050565b6000815180845261437781602086016020860161432f565b601f01601f19169290920160200192915050565b60808152600061439f60808301888a614306565b82810360208401526143b1818861435f565b905082810360408401526143c6818688614306565b915050826060830152979650505050505050565b602081526000611e6e602083018486614306565b634e487b7160e01b600052601260045260246000fd5b600082614413576144136143ee565b500690565b600082614427576144276143ee565b500490565b60006001600160401b038381169083168181101561444c5761444c6141a1565b039392505050565b60008235605e1983360301811261446a57600080fd5b9190910192915050565b600062ffffff821680614489576144896141a1565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144bd576144bd6141a1565b8260016001607f1b03190382128116156144d9576144d96141a1565b50019392505050565b60006001600160401b03808316818516808303821115614504576145046141a1565b01949350505050565b6000816000190483118215151615614527576145276141a1565b500290565b60008282101561453e5761453e6141a1565b500390565b6000825161446a81846020870161432f565b60006020828403121561456757600080fd5b5051919050565b80516020808301519190811015613af45760001960209190910360031b1b16919050565b600083516145a481846020880161432f565b6001600160801b0319939093169190920190815260100192915050565b6000816145d0576145d06141a1565b506000190190565b600081600f0b60016001607f1b03198114156145f6576145f66141a1565b60000392915050565b60006001600160ff1b0381841382841380821686840486111615614625576146256141a1565b600160ff1b6000871282811687830589121615614644576146446141a1565b60008712925087820587128484161615614660576146606141a1565b87850587128184161615614676576146766141a1565b505050929093029392505050565b600064ffffffffff8084168061469c5761469c6143ee565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146d3576146d36141a1565b8160016001607f1b030183138116156146ee576146ee6141a1565b5090039392505050565b600064ffffffffff80841680614710576147106143ee565b92169190910692915050565b600064ffffffffff80831681851681830481118215151615614740576147406141a1565b02949350505050565b60208152600061374e602083018461435f56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa26469706673582212203dadd2a426e1791f5c903112e0ab73d15f1b9ecfc133ae685656dd5e22e1c37964736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 6fcf36454..9c85ada3b 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -209,8 +209,6 @@ contract EigenPod is } // Process a checkpoint proof for a validator. - // - the validator MUST be in the ACTIVE state - // - the validator MUST NOT have already been proven for this checkpoint // // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. // The assumption is that if this is the case, any withdrawn ETH was already in @@ -536,6 +534,11 @@ contract EigenPod is "EigenPod._startCheckpoint: must finish previous checkpoint before starting another" ); + // Prevent a checkpoint being completable twice in the same block. This prevents an edge case + // where the second checkpoint would not be completable. + // + // This is because the validators checkpointed in the first checkpoint would have a `lastCheckpointedAt` + // value equal to the second checkpoint, causing their proofs to get skipped in `verifyCheckpointProofs` require( lastCheckpointTimestamp != uint64(block.timestamp), "EigenPod._startCheckpoint: cannot checkpoint twice in one block" @@ -623,11 +626,8 @@ contract EigenPod is (bool success, bytes memory result) = BEACON_ROOTS_ADDRESS.staticcall(abi.encode(timestamp)); - if (success && result.length > 0) { - return abi.decode(result, (bytes32)); - } else { - revert("EigenPod._getParentBlockRoot: invalid block root returned"); - } + require(success && result.length > 0, "EigenPod._getParentBlockRoot: invalid block root returned"); + return abi.decode(result, (bytes32)); } function _podWithdrawalCredentials() internal view returns (bytes memory) { diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 6c5c09586..1e71ebf98 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -44,7 +44,7 @@ abstract contract EigenPodStorage is IEigenPod { /// @notice For each checkpoint, the total balance attributed to exited validators, in gwei /// - /// Note that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's + /// NOTE that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's /// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their /// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator /// has been fully exited, it is possible that the magnitude of this change does not capture what is @@ -64,6 +64,12 @@ abstract contract EigenPodStorage is IEigenPod { /// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits /// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically /// exited. + /// + /// Additional edge cases this mapping does not cover: + /// - If a validator is slashed, their balance exited will reflect their original balance rather than the slashed amount + /// - The final partial withdrawal for an exited validator will be likely be included in this mapping. + /// i.e. if a validator was last checkpointed at 32.1 ETH before exiting, the next checkpoint will calculate their + /// "exited" amount to be 32.1 ETH rather than 32 ETH. mapping(uint64 => uint64) public checkpointBalanceExitedGwei; /// @notice The current checkpoint, if there is one active From f0e2b9ce79f6ed32250dd9f88fae55baffd2e75a Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 19 Jun 2024 15:56:18 +0000 Subject: [PATCH 25/85] chore: fix gas metering test to be consistent * also minor clarity tweak in verifyCheckpointProofs --- pkg/bindings/EigenPod/binding.go | 2 +- src/contracts/pods/EigenPod.sol | 14 ++++++++------ .../eigenpod/VerifyWC_StartCP_CompleteCP.t.sol | 5 ++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index ccff80197..2fe5b25e1 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620049d0380380620049d0833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147b26200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612fb8015260008181610483015261113701526147b26000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613afa565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613bb8565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c86565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613ce2565b610e12565b6040516101d99190613d5b565b34801561041957600080fd5b5061042d610428366004613d69565b610e77565b6040516101d99190613d82565b34801561044657600080fd5b50610400610455366004613d69565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dd8565b610f24565b6101a36104d3366004613df5565b611061565b3480156104e457600080fd5b5061042d6104f3366004613ce2565b61120e565b34801561050457600080fd5b506101a3610513366004613e88565b611301565b34801561052457600080fd5b506101a3610533366004613eb4565b61153e565b34801561054457600080fd5b506101a3610553366004613fa5565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614076565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140de565b1561067e5760405162461bcd60e51b8152600401610675906140fb565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140de565b156107275760405162461bcd60e51b8152600401610675906140fb565b600061076d6107368580614158565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d23565b60028111156107ed576107ed613d23565b8152505090506212750081604001516001600160401b031661080f91906141b7565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d23565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b8680614158565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c9792505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611cc1565b87611e76565b610a0b86356109f78780614158565b610a0460208a018a6141cf565b8651611fd1565b610a1560006121e8565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140de565b15610af15760405162461bcd60e51b8152600401610675906140fb565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611cc1565b89611e76565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe61425d565b9050602002016020810190610d139190614273565b8a8a86818110610d2557610d2561425d565b9050602002810190610d3791906141cf565b8a8a88818110610d4957610d4961425d565b9050602002810190610d5b9190614158565b61246a565b610d6a90836141b7565b915080610d768161429a565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b892505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d23565b6002811115610f1b57610f1b613d23565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140de565b15610ff75760405162461bcd60e51b8152600401610675906140fb565b611000826121e8565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b8152600401610675906142b5565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612ab2565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061438b565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143da565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129b892505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d23565b60028111156112f7576112f7613d23565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b8152600401610675906142b5565b611357633b9aca0082614404565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca0083614418565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b031661442c565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612af7565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b815260040161067590614215565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140de565b156117e85760405162461bcd60e51b8152600401610675906140fb565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf838583815181106118955761189561425d565b60200260200101518784815181106118af576118af61425d565b60200260200101516001600160a01b0316612b019092919063ffffffff16565b806118d98161429a565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140de565b156119915760405162461bcd60e51b8152600401610675906140fb565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612b53565b6000805b85811015611c1957600060366000898985818110611ab157611ab161425d565b9050602002810190611ac39190614454565b3581526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff166002811115611b3157611b31613d23565b6002811115611b4257611b42613d23565b9052509050600181606001516002811115611b5f57611b5f613d23565b14611b6a5750611c07565b846001600160401b031681604001516001600160401b031610611b8d5750611c07565b600080611bc083888d358d8d89818110611ba957611ba961425d565b9050602002810190611bbb9190614454565b612ccf565b602088018051929450909250611bd582614474565b62ffffff16905250606086018051839190611bf1908390614493565b600f0b905250611c0181866144e2565b94505050505b80611c118161429a565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611c46918591166144e2565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612ed5565b600081600081518110611c8857611c8861425d565b60200260200101519050919050565b600081600381518110611cac57611cac61425d565b60200260200101516000801b14159050919050565b6000611cd0611fff600c61450d565b611ce36001600160401b0384164261452c565b10611d4d5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611d9591614543565b600060405180830381855afa9150503d8060008114611dd0576040519150601f19603f3d011682016040523d82523d6000602084013e611dd5565b606091505b5091509150818015611de8575060008151115b611e5a5760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611e6e9190614555565b949350505050565b611e826003602061450d565b611e8f60208301836141cf565b905014611f045760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b611f54611f1460208301836141cf565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130dc565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b6008841461204c5760405162461bcd60e51b815260206004820152604e602482015260008051602061475d83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561205a602860016141b7565b61206491906141b7565b61206f90602061450d565b82146120dd5760405162461bcd60e51b8152602060048201526043602482015260008051602061475d83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b600061211b8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130f492505050565b9050600064ffffffffff8316612133602860016141b7565b600b901b17905061217e85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130dc565b6121de5760405162461bcd60e51b815260206004820152603d602482015260008051602061475d83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156122895760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b039081169116141561230e5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b031661232b633b9aca0047614418565b612335919061442c565b905081801561234b57506001600160401b038116155b156123be5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b600060405180608001604052806123d442611cc1565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061242f81612ed5565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806124a9848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611c7392505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561251857612518613d23565b600281111561252957612529613d23565b905250905060008160600151600281111561254657612546613d23565b146125e95760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b03801661262f8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a192505050565b6001600160401b0316146126b95760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b6126c1612ab2565b6126ca9061456e565b6127068686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133c692505050565b146127875760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006127c58686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133db92505050565b90506127d58a87878b8b8e611fd1565b603980549060006127e58361429a565b9091555050603a54600090600160401b90046001600160401b03161561281d57603a54600160401b90046001600160401b031661282a565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561290057612900613d23565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16129a8633b9aca006001600160401b03841661450d565b9c9b505050505050505050505050565b60008151603014612a415760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612a58908490600090602001614592565b60408051601f1981840301815290829052612a7291614543565b602060405180830381855afa158015612a8f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614555565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133f3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261153990849061350c565b612b5f600560036141b7565b612b6a90602061450d565b612b7760208301836141cf565b905014612bfa5760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612c4b612c0c60208401846141cf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130dc565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612ce78784886135de565b9050816001600160401b0316816001600160401b031614612d6157612d0c8183613755565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612de55760398054906000612d8f836145c1565b9091555050600260608a0152612da4856145d8565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b85356000908152603660209081526040918290208b518154928d0151938d01516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b03199095169190921617929092179283168217815560608c01518c9391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612e8557612e85613d23565b02179055505060405164ffffffffff851691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a350505094509492505050565b602081015162ffffff1661305c576000633b9aca00826060015183604001516001600160401b0316612f079190614493565b600f0b612f1491906145ff565b6040830151603480549293509091600090612f399084906001600160401b03166144e2565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612ffe57600080fd5b505af1158015613012573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130ea86858561376d565b1495945050505050565b600080600283516131059190614418565b90506000816001600160401b0381111561312157613121613ed1565b60405190808252806020026020018201604052801561314a578160200160208202803683370190505b50905060005b8281101561325157600285613165838361450d565b815181106131755761317561425d565b60200260200101518683600261318b919061450d565b6131969060016141b7565b815181106131a6576131a661425d565b60200260200101516040516020016131c8929190918252602082015260400190565b60408051601f19818403018152908290526131e291614543565b602060405180830381855afa1580156131ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132229190614555565b8282815181106132345761323461425d565b6020908102919091010152806132498161429a565b915050613150565b5061325d600283614418565b91505b811561337d5760005b8281101561336a5760028261327e838361450d565b8151811061328e5761328e61425d565b6020026020010151838360026132a4919061450d565b6132af9060016141b7565b815181106132bf576132bf61425d565b60200260200101516040516020016132e1929190918252602082015260400190565b60408051601f19818403018152908290526132fb91614543565b602060405180830381855afa158015613318573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061333b9190614555565b82828151811061334d5761334d61425d565b6020908102919091010152806133628161429a565b915050613269565b50613376600283614418565b9150613260565b806000815181106133905761339061425d565b602002602001015192505050919050565b6000610e71826006815181106133b9576133b961425d565b60200260200101516138b9565b600081600181518110611c8857611c8861425d565b6000610e71826002815181106133b9576133b961425d565b804710156134435760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613490576040519150601f19603f3d011682016040523d82523d6000602084013e613495565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613561826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139209092919063ffffffff16565b805190915015611539578080602001905181019061357f91906140de565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ec602660016141b7565b6135f790602061450d565b61360460408401846141cf565b9050146136755760405162461bcd60e51b81526020600482015260446024820181905260008051602061475d833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613682600485614684565b64ffffffffff1690506136dc61369b60408501856141cf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130dc565b61373c5760405162461bcd60e51b815260206004820152603e602482015260008051602061475d83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61374a83602001358561392f565b9150505b9392505050565b600061374e6001600160401b038084169085166146a8565b6000835160001415801561378c57506020845161378a9190614404565b155b61381b5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b855181116138af5761383f600285614404565b613872578151600052808601516020526020826040600060026107d05a03fa61386757600080fd5b60028404935061389d565b8086015160005281516020526020826040600060026107d05a03fa61389657600080fd5b6002840493505b6138a86020826141b7565b905061382c565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611e6e848460008561395c565b60008061393d6004846146f8565b61394890604061471c565b64ffffffffff169050611e6e84821b6138b9565b6060824710156139bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b613a145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a309190614543565b60006040518083038185875af1925050503d8060008114613a6d576040519150601f19603f3d011682016040523d82523d6000602084013e613a72565b606091505b5091509150613a82828286613a8d565b979650505050505050565b60608315613a9c57508161374e565b825115613aac5782518084602001fd5b8160405162461bcd60e51b81526004016106759190614749565b80356001600160401b0381168114613add57600080fd5b919050565b600060408284031215613af457600080fd5b50919050565b600080600060608486031215613b0f57600080fd5b613b1884613ac6565b925060208401356001600160401b0380821115613b3457600080fd5b613b4087838801613ae2565b93506040860135915080821115613b5657600080fd5b50613b6386828701613ae2565b9150509250925092565b60008083601f840112613b7f57600080fd5b5081356001600160401b03811115613b9657600080fd5b6020830191508360208260051b8501011115613bb157600080fd5b9250929050565b60008060008060008060008060a0898b031215613bd457600080fd5b613bdd89613ac6565b975060208901356001600160401b0380821115613bf957600080fd5b613c058c838d01613ae2565b985060408b0135915080821115613c1b57600080fd5b613c278c838d01613b6d565b909850965060608b0135915080821115613c4057600080fd5b613c4c8c838d01613b6d565b909650945060808b0135915080821115613c6557600080fd5b50613c728b828c01613b6d565b999c989b5096995094979396929594505050565b600060208284031215613c9857600080fd5b61374e82613ac6565b60008083601f840112613cb357600080fd5b5081356001600160401b03811115613cca57600080fd5b602083019150836020828501011115613bb157600080fd5b60008060208385031215613cf557600080fd5b82356001600160401b03811115613d0b57600080fd5b613d1785828601613ca1565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d5757634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d39565b600060208284031215613d7b57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613dc36060840182613d39565b5092915050565b80151581146130d957600080fd5b600060208284031215613dea57600080fd5b813561374e81613dca565b600080600080600060608688031215613e0d57600080fd5b85356001600160401b0380821115613e2457600080fd5b613e3089838a01613ca1565b90975095506020880135915080821115613e4957600080fd5b50613e5688828901613ca1565b96999598509660400135949350505050565b6001600160a01b03811681146130d957600080fd5b8035613add81613e68565b60008060408385031215613e9b57600080fd5b8235613ea681613e68565b946020939093013593505050565b600060208284031215613ec657600080fd5b813561374e81613e68565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613f0f57613f0f613ed1565b604052919050565b60006001600160401b03821115613f3057613f30613ed1565b5060051b60200190565b600082601f830112613f4b57600080fd5b81356020613f60613f5b83613f17565b613ee7565b82815260059290921b84018101918181019086841115613f7f57600080fd5b8286015b84811015613f9a5780358352918301918301613f83565b509695505050505050565b600080600060608486031215613fba57600080fd5b83356001600160401b0380821115613fd157600080fd5b818601915086601f830112613fe557600080fd5b81356020613ff5613f5b83613f17565b82815260059290921b8401810191818101908a84111561401457600080fd5b948201945b8386101561403b57853561402c81613e68565b82529482019490820190614019565b9750508701359250508082111561405157600080fd5b5061405e86828701613f3a565b92505061406d60408501613e7d565b90509250925092565b60008060006040848603121561408b57600080fd5b83356001600160401b03808211156140a257600080fd5b6140ae87838801613ae2565b945060208601359150808211156140c457600080fd5b506140d186828701613b6d565b9497909650939450505050565b6000602082840312156140f057600080fd5b815161374e81613dca565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261416f57600080fd5b8301803591506001600160401b0382111561418957600080fd5b6020019150600581901b3603821315613bb157600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ca576141ca6141a1565b500190565b6000808335601e198436030181126141e657600080fd5b8301803591506001600160401b0382111561420057600080fd5b602001915036819003821315613bb157600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561428557600080fd5b813564ffffffffff8116811461374e57600080fd5b60006000198214156142ae576142ae6141a1565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561434a578181015183820152602001614332565b83811115614359576000848401525b50505050565b6000815180845261437781602086016020860161432f565b601f01601f19169290920160200192915050565b60808152600061439f60808301888a614306565b82810360208401526143b1818861435f565b905082810360408401526143c6818688614306565b915050826060830152979650505050505050565b602081526000611e6e602083018486614306565b634e487b7160e01b600052601260045260246000fd5b600082614413576144136143ee565b500690565b600082614427576144276143ee565b500490565b60006001600160401b038381169083168181101561444c5761444c6141a1565b039392505050565b60008235605e1983360301811261446a57600080fd5b9190910192915050565b600062ffffff821680614489576144896141a1565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144bd576144bd6141a1565b8260016001607f1b03190382128116156144d9576144d96141a1565b50019392505050565b60006001600160401b03808316818516808303821115614504576145046141a1565b01949350505050565b6000816000190483118215151615614527576145276141a1565b500290565b60008282101561453e5761453e6141a1565b500390565b6000825161446a81846020870161432f565b60006020828403121561456757600080fd5b5051919050565b80516020808301519190811015613af45760001960209190910360031b1b16919050565b600083516145a481846020880161432f565b6001600160801b0319939093169190920190815260100192915050565b6000816145d0576145d06141a1565b506000190190565b600081600f0b60016001607f1b03198114156145f6576145f66141a1565b60000392915050565b60006001600160ff1b0381841382841380821686840486111615614625576146256141a1565b600160ff1b6000871282811687830589121615614644576146446141a1565b60008712925087820587128484161615614660576146606141a1565b87850587128184161615614676576146766141a1565b505050929093029392505050565b600064ffffffffff8084168061469c5761469c6143ee565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146d3576146d36141a1565b8160016001607f1b030183138116156146ee576146ee6141a1565b5090039392505050565b600064ffffffffff80841680614710576147106143ee565b92169190910692915050565b600064ffffffffff80831681851681830481118215151615614740576147406141a1565b02949350505050565b60208152600061374e602083018461435f56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa26469706673582212203dadd2a426e1791f5c903112e0ab73d15f1b9ecfc133ae685656dd5e22e1c37964736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b50604051620049b4380380620049b4833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147966200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612f9c015260008181610483015261113701526147966000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613ade565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9c565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c6a565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc6565b610e12565b6040516101d99190613d3f565b34801561041957600080fd5b5061042d610428366004613d4d565b610e77565b6040516101d99190613d66565b34801561044657600080fd5b50610400610455366004613d4d565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dbc565b610f24565b6101a36104d3366004613dd9565b611061565b3480156104e457600080fd5b5061042d6104f3366004613cc6565b61120e565b34801561050457600080fd5b506101a3610513366004613e6c565b611301565b34801561052457600080fd5b506101a3610533366004613e98565b61153e565b34801561054457600080fd5b506101a3610553366004613f89565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a361059336600461405a565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c2565b1561067e5760405162461bcd60e51b8152600401610675906140df565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c2565b156107275760405162461bcd60e51b8152600401610675906140df565b600061076d610736858061413c565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3b92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d07565b60028111156107ed576107ed613d07565b8152505090506212750081604001516001600160401b031661080f919061419b565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d07565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413c565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5f92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d89565b87611f3e565b610a0b86356109f7878061413c565b610a0460208a018a6141b3565b8651612099565b610a1560006122b0565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c2565b15610af15760405162461bcd60e51b8152600401610675906140df565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d89565b89611f3e565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe614241565b9050602002016020810190610d139190614257565b8a8a86818110610d2557610d25614241565b9050602002810190610d3791906141b3565b8a8a88818110610d4957610d49614241565b9050602002810190610d5b919061413c565b612532565b610d6a908361419b565b915080610d768161427e565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8092505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d07565b6002811115610f1b57610f1b613d07565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140c2565b15610ff75760405162461bcd60e51b8152600401610675906140df565b611000826122b0565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b815260040161067590614299565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612b7a565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061436f565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143be565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8092505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d07565b60028111156112f7576112f7613d07565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b815260040161067590614299565b611357633b9aca00826143e8565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca00836143fc565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b0316614410565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612bbf565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140c2565b156117e85760405162461bcd60e51b8152600401610675906140df565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf8385838151811061189557611895614241565b60200260200101518784815181106118af576118af614241565b60200260200101516001600160a01b0316612bc99092919063ffffffff16565b806118d98161427e565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140c2565b156119915760405162461bcd60e51b8152600401610675906140df565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612c1b565b6000805b85811015611ce15736878783818110611aac57611aac614241565b9050602002810190611abe9190614438565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2f57611b2f613d07565b6002811115611b4057611b40613d07565b9052509050600181606001516002811115611b5d57611b5d613d07565b14611b69575050611ccf565b856001600160401b031681604001516001600160401b031610611b8d575050611ccf565b600080611b9d83898e3587612d97565b602089018051929450909250611bb282614458565b62ffffff16905250606087018051839190611bce908390614477565b600f0b905250611bde81876144c6565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8357611c83613d07565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd98161427e565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611d0e918591166144c6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb9565b600081600081518110611d5057611d50614241565b60200260200101519050919050565b600081600381518110611d7457611d74614241565b60200260200101516000801b14159050919050565b6000611d98611fff600c6144f1565b611dab6001600160401b03841642614510565b10611e155760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5d91614527565b600060405180830381855afa9150503d8060008114611e98576040519150601f19603f3d011682016040523d82523d6000602084013e611e9d565b606091505b5091509150818015611eb0575060008151115b611f225760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f369190614539565b949350505050565b611f4a600360206144f1565b611f5760208301836141b3565b905014611fcc5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201c611fdc60208301836141b3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130c0565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121145760405162461bcd60e51b815260206004820152604e602482015260008051602061474183398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b60056121226028600161419b565b61212c919061419b565b6121379060206144f1565b82146121a55760405162461bcd60e51b8152602060048201526043602482015260008051602061474183398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e38686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d892505050565b9050600064ffffffffff83166121fb6028600161419b565b600b901b17905061224685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130c0565b6122a65760405162461bcd60e51b815260206004820152603d602482015260008051602061474183398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123515760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d65760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f3633b9aca00476143fc565b6123fd9190614410565b905081801561241357506001600160401b038116155b156124865760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249c42611d89565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f781612eb9565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612571848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3b92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125e0576125e0613d07565b60028111156125f1576125f1613d07565b905250905060008160600151600281111561260e5761260e613d07565b146126b15760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338592505050565b6001600160401b0316146127815760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612789612b7a565b61279290614552565b6127ce8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133aa92505050565b1461284f5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288d8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bf92505050565b905061289d8a87878b8b8e612099565b603980549060006128ad8361427e565b9091555050603a54600090600160401b90046001600160401b0316156128e557603a54600160401b90046001600160401b03166128f2565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c8576129c8613d07565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a70633b9aca006001600160401b0384166144f1565b9c9b505050505050505050505050565b60008151603014612b095760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b20908490600090602001614576565b60408051601f1981840301815290829052612b3a91614527565b602060405180830381855afa158015612b57573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614539565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133d7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115399084906134f0565b612c276005600361419b565b612c329060206144f1565b612c3f60208301836141b3565b905014612cc25760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d13612cd460208401846141b3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130c0565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612daf8784886135c2565b9050816001600160401b0316816001600160401b031614612e2957612dd48183613739565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612ead5760398054906000612e57836145a5565b9091555050600260608a0152612e6c856145bc565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff16613040576000633b9aca00826060015183604001516001600160401b0316612eeb9190614477565b600f0b612ef891906145e3565b6040830151603480549293509091600090612f1d9084906001600160401b03166144c6565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130ce868585613751565b1495945050505050565b600080600283516130e991906143fc565b90506000816001600160401b0381111561310557613105613eb5565b60405190808252806020026020018201604052801561312e578160200160208202803683370190505b50905060005b828110156132355760028561314983836144f1565b8151811061315957613159614241565b60200260200101518683600261316f91906144f1565b61317a90600161419b565b8151811061318a5761318a614241565b60200260200101516040516020016131ac929190918252602082015260400190565b60408051601f19818403018152908290526131c691614527565b602060405180830381855afa1580156131e3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132069190614539565b82828151811061321857613218614241565b60209081029190910101528061322d8161427e565b915050613134565b506132416002836143fc565b91505b81156133615760005b8281101561334e5760028261326283836144f1565b8151811061327257613272614241565b60200260200101518383600261328891906144f1565b61329390600161419b565b815181106132a3576132a3614241565b60200260200101516040516020016132c5929190918252602082015260400190565b60408051601f19818403018152908290526132df91614527565b602060405180830381855afa1580156132fc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331f9190614539565b82828151811061333157613331614241565b6020908102919091010152806133468161427e565b91505061324d565b5061335a6002836143fc565b9150613244565b8060008151811061337457613374614241565b602002602001015192505050919050565b6000610e718260068151811061339d5761339d614241565b602002602001015161389d565b600081600181518110611d5057611d50614241565b6000610e718260028151811061339d5761339d614241565b804710156134275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613474576040519150601f19603f3d011682016040523d82523d6000602084013e613479565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139049092919063ffffffff16565b805190915015611539578080602001905181019061356391906140c2565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135d06026600161419b565b6135db9060206144f1565b6135e860408401846141b3565b9050146136595760405162461bcd60e51b815260206004820152604460248201819052600080516020614741833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613666600485614668565b64ffffffffff1690506136c061367f60408501856141b3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130c0565b6137205760405162461bcd60e51b815260206004820152603e602482015260008051602061474183398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372e836020013585613913565b9150505b9392505050565b60006137326001600160401b0380841690851661468c565b6000835160001415801561377057506020845161376e91906143e8565b155b6137ff5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613893576138236002856143e8565b613856578151600052808601516020526020826040600060026107d05a03fa61384b57600080fd5b600284049350613881565b8086015160005281516020526020826040600060026107d05a03fa61387a57600080fd5b6002840493505b61388c60208261419b565b9050613810565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f368484600085613940565b6000806139216004846146dc565b61392c906040614700565b64ffffffffff169050611f3684821b61389d565b6060824710156139a15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a149190614527565b60006040518083038185875af1925050503d8060008114613a51576040519150601f19603f3d011682016040523d82523d6000602084013e613a56565b606091505b5091509150613a66828286613a71565b979650505050505050565b60608315613a80575081613732565b825115613a905782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472d565b80356001600160401b0381168114613ac157600080fd5b919050565b600060408284031215613ad857600080fd5b50919050565b600080600060608486031215613af357600080fd5b613afc84613aaa565b925060208401356001600160401b0380821115613b1857600080fd5b613b2487838801613ac6565b93506040860135915080821115613b3a57600080fd5b50613b4786828701613ac6565b9150509250925092565b60008083601f840112613b6357600080fd5b5081356001600160401b03811115613b7a57600080fd5b6020830191508360208260051b8501011115613b9557600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb857600080fd5b613bc189613aaa565b975060208901356001600160401b0380821115613bdd57600080fd5b613be98c838d01613ac6565b985060408b0135915080821115613bff57600080fd5b613c0b8c838d01613b51565b909850965060608b0135915080821115613c2457600080fd5b613c308c838d01613b51565b909650945060808b0135915080821115613c4957600080fd5b50613c568b828c01613b51565b999c989b5096995094979396929594505050565b600060208284031215613c7c57600080fd5b61373282613aaa565b60008083601f840112613c9757600080fd5b5081356001600160401b03811115613cae57600080fd5b602083019150836020828501011115613b9557600080fd5b60008060208385031215613cd957600080fd5b82356001600160401b03811115613cef57600080fd5b613cfb85828601613c85565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3b57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d1d565b600060208284031215613d5f57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da76060840182613d1d565b5092915050565b80151581146130bd57600080fd5b600060208284031215613dce57600080fd5b813561373281613dae565b600080600080600060608688031215613df157600080fd5b85356001600160401b0380821115613e0857600080fd5b613e1489838a01613c85565b90975095506020880135915080821115613e2d57600080fd5b50613e3a88828901613c85565b96999598509660400135949350505050565b6001600160a01b03811681146130bd57600080fd5b8035613ac181613e4c565b60008060408385031215613e7f57600080fd5b8235613e8a81613e4c565b946020939093013593505050565b600060208284031215613eaa57600080fd5b813561373281613e4c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef357613ef3613eb5565b604052919050565b60006001600160401b03821115613f1457613f14613eb5565b5060051b60200190565b600082601f830112613f2f57600080fd5b81356020613f44613f3f83613efb565b613ecb565b82815260059290921b84018101918181019086841115613f6357600080fd5b8286015b84811015613f7e5780358352918301918301613f67565b509695505050505050565b600080600060608486031215613f9e57600080fd5b83356001600160401b0380821115613fb557600080fd5b818601915086601f830112613fc957600080fd5b81356020613fd9613f3f83613efb565b82815260059290921b8401810191818101908a841115613ff857600080fd5b948201945b8386101561401f57853561401081613e4c565b82529482019490820190613ffd565b9750508701359250508082111561403557600080fd5b5061404286828701613f1e565b92505061405160408501613e61565b90509250925092565b60008060006040848603121561406f57600080fd5b83356001600160401b038082111561408657600080fd5b61409287838801613ac6565b945060208601359150808211156140a857600080fd5b506140b586828701613b51565b9497909650939450505050565b6000602082840312156140d457600080fd5b815161373281613dae565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415357600080fd5b8301803591506001600160401b0382111561416d57600080fd5b6020019150600581901b3603821315613b9557600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ae576141ae614185565b500190565b6000808335601e198436030181126141ca57600080fd5b8301803591506001600160401b038211156141e457600080fd5b602001915036819003821315613b9557600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426957600080fd5b813564ffffffffff8116811461373257600080fd5b600060001982141561429257614292614185565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432e578181015183820152602001614316565b8381111561433d576000848401525b50505050565b6000815180845261435b816020860160208601614313565b601f01601f19169290920160200192915050565b60808152600061438360808301888a6142ea565b82810360208401526143958188614343565b905082810360408401526143aa8186886142ea565b915050826060830152979650505050505050565b602081526000611f366020830184866142ea565b634e487b7160e01b600052601260045260246000fd5b6000826143f7576143f76143d2565b500690565b60008261440b5761440b6143d2565b500490565b60006001600160401b038381169083168181101561443057614430614185565b039392505050565b60008235605e1983360301811261444e57600080fd5b9190910192915050565b600062ffffff82168061446d5761446d614185565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144a1576144a1614185565b8260016001607f1b03190382128116156144bd576144bd614185565b50019392505050565b60006001600160401b038083168185168083038211156144e8576144e8614185565b01949350505050565b600081600019048311821515161561450b5761450b614185565b500290565b60008282101561452257614522614185565b500390565b6000825161444e818460208701614313565b60006020828403121561454b57600080fd5b5051919050565b80516020808301519190811015613ad85760001960209190910360031b1b16919050565b60008351614588818460208801614313565b6001600160801b0319939093169190920190815260100192915050565b6000816145b4576145b4614185565b506000190190565b600081600f0b60016001607f1b03198114156145da576145da614185565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460957614609614185565b600160ff1b600087128281168783058912161561462857614628614185565b6000871292508782058712848416161561464457614644614185565b8785058712818416161561465a5761465a614185565b505050929093029392505050565b600064ffffffffff80841680614680576146806143d2565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b7576146b7614185565b8160016001607f1b030183138116156146d2576146d2614185565b5090039392505050565b600064ffffffffff808416806146f4576146f46143d2565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472457614724614185565b02949350505050565b602081526000613732602083018461434356fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220ce16b3a1e7b54ca6a388dca2755175e8af312a0288f82dc2dbe1d4f71327b0ae64736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 9c85ada3b..727ec2be9 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -191,7 +191,8 @@ contract EigenPod is // Process each checkpoint proof submitted uint64 exitedBalancesGwei; for (uint256 i = 0; i < proofs.length; i++) { - ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proofs[i].pubkeyHash]; + BeaconChainProofs.BalanceProof calldata proof = proofs[i]; + ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[proof.pubkeyHash]; // Validator must be in the ACTIVE state to be provable during a checkpoint. // Validators become ACTIVE when initially proven via verifyWithdrawalCredentials @@ -208,7 +209,7 @@ contract EigenPod is continue; } - // Process a checkpoint proof for a validator. + // Process a checkpoint proof for a validator and update its balance. // // If the proof shows the validator has a balance of 0, they are marked `WITHDRAWN`. // The assumption is that if this is the case, any withdrawn ETH was already in @@ -217,12 +218,16 @@ contract EigenPod is validatorInfo: validatorInfo, checkpointTimestamp: checkpointTimestamp, balanceContainerRoot: balanceContainerProof.balanceContainerRoot, - proof: proofs[i] + proof: proof }); checkpoint.proofsRemaining--; checkpoint.balanceDeltasGwei += balanceDeltaGwei; exitedBalancesGwei += exitedBalanceGwei; + + // Record the updated validator in state + _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; + emit ValidatorCheckpointed(checkpointTimestamp, uint40(validatorInfo.validatorIndex)); } // Update the checkpoint and the total amount attributed to exited validators @@ -509,9 +514,6 @@ contract EigenPod is emit ValidatorWithdrawn(checkpointTimestamp, validatorIndex); } - _validatorPubkeyHashToInfo[proof.pubkeyHash] = validatorInfo; - emit ValidatorCheckpointed(checkpointTimestamp, validatorIndex); - return (balanceDeltaGwei, exitedBalanceGwei); } 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 af4425232..61b123383 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -16,8 +16,11 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { _; } - function test_GasMetering() public r(24) { + function test_GasMetering() public r(0) { (User staker, ,) = _newRandomStaker(); + // 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); cheats.pauseGasMetering(); (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); From 571cb3d1425fd254b7b58fbe193a9047a9a41c8c Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:33:34 -0400 Subject: [PATCH 26/85] test: eigenpod unit tests with checkpointing (#591) * test: testings init * test: eigenpod unit tests refactor * test: startCheckpoint unit tests * test: pod unit tests * fix: rebase changes * chore: make bindings * chore: revert pod changes * test: add several tests and checks --------- Co-authored-by: wadealexc --- pkg/bindings/EigenPod/binding.go | 2 +- src/contracts/pods/EigenPod.sol | 7 +- src/test/EigenPod.t.sol | 72 - src/test/events/IEigenPodEvents.sol | 31 +- src/test/harnesses/EigenPodHarness.sol | 4 +- .../integration/IntegrationDeployer.t.sol | 6 +- .../integration/mocks/BeaconChainMock.t.sol | 22 +- src/test/mocks/EigenPodManagerMock.sol | 28 +- src/test/tree/EigenPodUnit.tree | 171 +- .../unit/DelayedWithdrawalRouterUnit.t.sol | 879 +++---- src/test/unit/EigenPodUnit.t.sol | 2304 +++++++++++------ src/test/utils/EigenLayerUnitTestSetup.sol | 2 +- src/test/utils/EigenPodUser.t.sol | 251 ++ 13 files changed, 2299 insertions(+), 1480 deletions(-) create mode 100644 src/test/utils/EigenPodUser.t.sol diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 2fe5b25e1..3ec052703 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620049b4380380620049b4833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147966200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da801528181610f670152818161106c0152818161130c01528181611758015281816119010152612f9c015260008181610483015261113701526147966000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613ade565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9c565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c6a565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc6565b610e12565b6040516101d99190613d3f565b34801561041957600080fd5b5061042d610428366004613d4d565b610e77565b6040516101d99190613d66565b34801561044657600080fd5b50610400610455366004613d4d565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dbc565b610f24565b6101a36104d3366004613dd9565b611061565b3480156104e457600080fd5b5061042d6104f3366004613cc6565b61120e565b34801561050457600080fd5b506101a3610513366004613e6c565b611301565b34801561052457600080fd5b506101a3610533366004613e98565b61153e565b34801561054457600080fd5b506101a3610553366004613f89565b611715565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a361059336600461405a565b6118e8565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c2565b1561067e5760405162461bcd60e51b8152600401610675906140df565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c2565b156107275760405162461bcd60e51b8152600401610675906140df565b600061076d610736858061413c565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3b92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d07565b60028111156107ed576107ed613d07565b8152505090506212750081604001516001600160401b031661080f919061419b565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d07565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413c565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5f92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d89565b87611f3e565b610a0b86356109f7878061413c565b610a0460208a018a6141b3565b8651612099565b610a1560006122b0565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c2565b15610af15760405162461bcd60e51b8152600401610675906140df565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d89565b89611f3e565b6000805b87811015610d7e57610d608b8b358b8b85818110610cfe57610cfe614241565b9050602002016020810190610d139190614257565b8a8a86818110610d2557610d25614241565b9050602002810190610d3791906141b3565b8a8a88818110610d4957610d49614241565b9050602002810190610d5b919061413c565b612532565b610d6a908361419b565b915080610d768161427e565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610dee57600080fd5b505af1158015610e02573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8092505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9f6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0a57610f0a613d07565b6002811115610f1b57610f1b613d07565b90525092915050565b6033546001600160a01b03163314610f4e5760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906140c2565b15610ff75760405162461bcd60e51b8152600401610675906140df565b611000826122b0565b603454600160401b900460ff1661105d576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a95760405162461bcd60e51b815260040161067590614299565b346801bc16d674ec800000146111355760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611178612b7a565b8888886040518863ffffffff1660e01b815260040161119c9695949392919061436f565b6000604051808303818588803b1580156111b557600080fd5b505af11580156111c9573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111ff9291906143be565b60405180910390a15050505050565b6112366040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127985858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a8092505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e6576112e6613d07565b60028111156112f7576112f7613d07565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113495760405162461bcd60e51b815260040161067590614299565b611357633b9aca00826143e8565b156113e15760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f1633b9aca00836143fc565b6034549091506001600160401b0390811690821611156114aa5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c89084906001600160401b0316614410565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152791815260200190565b60405180910390a26115398383612bbf565b505050565b600054610100900460ff161580801561155e5750600054600160ff909116105b806115785750303b158015611578575060005460ff166001145b6115db5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fe576000805461ff0019166101001790555b6001600160a01b0382166116715760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173f5760405162461bcd60e51b8152600401610675906141f9565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb91906140c2565b156117e85760405162461bcd60e51b8152600401610675906140df565b82518451146118735760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e1576118cf8385838151811061189557611895614241565b60200260200101518784815181106118af576118af614241565b60200260200101516001600160a01b0316612bc99092919063ffffffff16565b806118d98161427e565b915050611876565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197491906140c2565b156119915760405162461bcd60e51b8152600401610675906140df565b603a54600160401b90046001600160401b031680611a3d5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8d9087612c1b565b6000805b85811015611ce15736878783818110611aac57611aac614241565b9050602002810190611abe9190614438565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2f57611b2f613d07565b6002811115611b4057611b40613d07565b9052509050600181606001516002811115611b5d57611b5d613d07565b14611b69575050611ccf565b856001600160401b031681604001516001600160401b031610611b8d575050611ccf565b600080611b9d83898e3587612d97565b602089018051929450909250611bb282614458565b62ffffff16905250606087018051839190611bce908390614477565b600f0b905250611bde81876144c6565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8357611c83613d07565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd98161427e565b915050611a91565b506001600160401b038084166000908152603b6020526040812080548493919291611d0e918591166144c6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb9565b600081600081518110611d5057611d50614241565b60200260200101519050919050565b600081600381518110611d7457611d74614241565b60200260200101516000801b14159050919050565b6000611d98611fff600c6144f1565b611dab6001600160401b03841642614510565b10611e155760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5d91614527565b600060405180830381855afa9150503d8060008114611e98576040519150601f19603f3d011682016040523d82523d6000602084013e611e9d565b606091505b5091509150818015611eb0575060008151115b611f225760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f369190614539565b949350505050565b611f4a600360206144f1565b611f5760208301836141b3565b905014611fcc5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201c611fdc60208301836141b3565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130c0565b61105d5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121145760405162461bcd60e51b815260206004820152604e602482015260008051602061474183398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b60056121226028600161419b565b61212c919061419b565b6121379060206144f1565b82146121a55760405162461bcd60e51b8152602060048201526043602482015260008051602061474183398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e38686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d892505050565b9050600064ffffffffff83166121fb6028600161419b565b600b901b17905061224685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130c0565b6122a65760405162461bcd60e51b815260206004820152603d602482015260008051602061474183398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123515760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d65760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f3633b9aca00476143fc565b6123fd9190614410565b905081801561241357506001600160401b038116155b156124865760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249c42611d89565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f781612eb9565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612571848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3b92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125e0576125e0613d07565b60028111156125f1576125f1613d07565b905250905060008160600151600281111561260e5761260e613d07565b146126b15760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338592505050565b6001600160401b0316146127815760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612789612b7a565b61279290614552565b6127ce8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133aa92505050565b1461284f5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288d8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bf92505050565b905061289d8a87878b8b8e612099565b603980549060006128ad8361427e565b9091555050603a54600090600160401b90046001600160401b0316156128e557603a54600160401b90046001600160401b03166128f2565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c8576129c8613d07565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a70633b9aca006001600160401b0384166144f1565b9c9b505050505050505050505050565b60008151603014612b095760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b20908490600090602001614576565b60408051601f1981840301815290829052612b3a91614527565b602060405180830381855afa158015612b57573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e719190614539565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105d82826133d7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115399084906134f0565b612c276005600361419b565b612c329060206144f1565b612c3f60208301836141b3565b905014612cc25760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d13612cd460208401846141b3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130c0565b6115395760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612daf8784886135c2565b9050816001600160401b0316816001600160401b031614612e2957612dd48183613739565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612ead5760398054906000612e57836145a5565b9091555050600260608a0152612e6c856145bc565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff16613040576000633b9aca00826060015183604001516001600160401b0316612eeb9190614477565b600f0b612ef891906145e3565b6040830151603480549293509091600090612f1d9084906001600160401b03166144c6565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe257600080fd5b505af1158015612ff6573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130ce868585613751565b1495945050505050565b600080600283516130e991906143fc565b90506000816001600160401b0381111561310557613105613eb5565b60405190808252806020026020018201604052801561312e578160200160208202803683370190505b50905060005b828110156132355760028561314983836144f1565b8151811061315957613159614241565b60200260200101518683600261316f91906144f1565b61317a90600161419b565b8151811061318a5761318a614241565b60200260200101516040516020016131ac929190918252602082015260400190565b60408051601f19818403018152908290526131c691614527565b602060405180830381855afa1580156131e3573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132069190614539565b82828151811061321857613218614241565b60209081029190910101528061322d8161427e565b915050613134565b506132416002836143fc565b91505b81156133615760005b8281101561334e5760028261326283836144f1565b8151811061327257613272614241565b60200260200101518383600261328891906144f1565b61329390600161419b565b815181106132a3576132a3614241565b60200260200101516040516020016132c5929190918252602082015260400190565b60408051601f19818403018152908290526132df91614527565b602060405180830381855afa1580156132fc573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331f9190614539565b82828151811061333157613331614241565b6020908102919091010152806133468161427e565b91505061324d565b5061335a6002836143fc565b9150613244565b8060008151811061337457613374614241565b602002602001015192505050919050565b6000610e718260068151811061339d5761339d614241565b602002602001015161389d565b600081600181518110611d5057611d50614241565b6000610e718260028151811061339d5761339d614241565b804710156134275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613474576040519150601f19603f3d011682016040523d82523d6000602084013e613479565b606091505b50509050806115395760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613545826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139049092919063ffffffff16565b805190915015611539578080602001905181019061356391906140c2565b6115395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135d06026600161419b565b6135db9060206144f1565b6135e860408401846141b3565b9050146136595760405162461bcd60e51b815260206004820152604460248201819052600080516020614741833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613666600485614668565b64ffffffffff1690506136c061367f60408501856141b3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130c0565b6137205760405162461bcd60e51b815260206004820152603e602482015260008051602061474183398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372e836020013585613913565b9150505b9392505050565b60006137326001600160401b0380841690851661468c565b6000835160001415801561377057506020845161376e91906143e8565b155b6137ff5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613893576138236002856143e8565b613856578151600052808601516020526020826040600060026107d05a03fa61384b57600080fd5b600284049350613881565b8086015160005281516020526020826040600060026107d05a03fa61387a57600080fd5b6002840493505b61388c60208261419b565b9050613810565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f368484600085613940565b6000806139216004846146dc565b61392c906040614700565b64ffffffffff169050611f3684821b61389d565b6060824710156139a15760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a149190614527565b60006040518083038185875af1925050503d8060008114613a51576040519150601f19603f3d011682016040523d82523d6000602084013e613a56565b606091505b5091509150613a66828286613a71565b979650505050505050565b60608315613a80575081613732565b825115613a905782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472d565b80356001600160401b0381168114613ac157600080fd5b919050565b600060408284031215613ad857600080fd5b50919050565b600080600060608486031215613af357600080fd5b613afc84613aaa565b925060208401356001600160401b0380821115613b1857600080fd5b613b2487838801613ac6565b93506040860135915080821115613b3a57600080fd5b50613b4786828701613ac6565b9150509250925092565b60008083601f840112613b6357600080fd5b5081356001600160401b03811115613b7a57600080fd5b6020830191508360208260051b8501011115613b9557600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb857600080fd5b613bc189613aaa565b975060208901356001600160401b0380821115613bdd57600080fd5b613be98c838d01613ac6565b985060408b0135915080821115613bff57600080fd5b613c0b8c838d01613b51565b909850965060608b0135915080821115613c2457600080fd5b613c308c838d01613b51565b909650945060808b0135915080821115613c4957600080fd5b50613c568b828c01613b51565b999c989b5096995094979396929594505050565b600060208284031215613c7c57600080fd5b61373282613aaa565b60008083601f840112613c9757600080fd5b5081356001600160401b03811115613cae57600080fd5b602083019150836020828501011115613b9557600080fd5b60008060208385031215613cd957600080fd5b82356001600160401b03811115613cef57600080fd5b613cfb85828601613c85565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3b57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e718284613d1d565b600060208284031215613d5f57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da76060840182613d1d565b5092915050565b80151581146130bd57600080fd5b600060208284031215613dce57600080fd5b813561373281613dae565b600080600080600060608688031215613df157600080fd5b85356001600160401b0380821115613e0857600080fd5b613e1489838a01613c85565b90975095506020880135915080821115613e2d57600080fd5b50613e3a88828901613c85565b96999598509660400135949350505050565b6001600160a01b03811681146130bd57600080fd5b8035613ac181613e4c565b60008060408385031215613e7f57600080fd5b8235613e8a81613e4c565b946020939093013593505050565b600060208284031215613eaa57600080fd5b813561373281613e4c565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef357613ef3613eb5565b604052919050565b60006001600160401b03821115613f1457613f14613eb5565b5060051b60200190565b600082601f830112613f2f57600080fd5b81356020613f44613f3f83613efb565b613ecb565b82815260059290921b84018101918181019086841115613f6357600080fd5b8286015b84811015613f7e5780358352918301918301613f67565b509695505050505050565b600080600060608486031215613f9e57600080fd5b83356001600160401b0380821115613fb557600080fd5b818601915086601f830112613fc957600080fd5b81356020613fd9613f3f83613efb565b82815260059290921b8401810191818101908a841115613ff857600080fd5b948201945b8386101561401f57853561401081613e4c565b82529482019490820190613ffd565b9750508701359250508082111561403557600080fd5b5061404286828701613f1e565b92505061405160408501613e61565b90509250925092565b60008060006040848603121561406f57600080fd5b83356001600160401b038082111561408657600080fd5b61409287838801613ac6565b945060208601359150808211156140a857600080fd5b506140b586828701613b51565b9497909650939450505050565b6000602082840312156140d457600080fd5b815161373281613dae565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415357600080fd5b8301803591506001600160401b0382111561416d57600080fd5b6020019150600581901b3603821315613b9557600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ae576141ae614185565b500190565b6000808335601e198436030181126141ca57600080fd5b8301803591506001600160401b038211156141e457600080fd5b602001915036819003821315613b9557600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426957600080fd5b813564ffffffffff8116811461373257600080fd5b600060001982141561429257614292614185565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432e578181015183820152602001614316565b8381111561433d576000848401525b50505050565b6000815180845261435b816020860160208601614313565b601f01601f19169290920160200192915050565b60808152600061438360808301888a6142ea565b82810360208401526143958188614343565b905082810360408401526143aa8186886142ea565b915050826060830152979650505050505050565b602081526000611f366020830184866142ea565b634e487b7160e01b600052601260045260246000fd5b6000826143f7576143f76143d2565b500690565b60008261440b5761440b6143d2565b500490565b60006001600160401b038381169083168181101561443057614430614185565b039392505050565b60008235605e1983360301811261444e57600080fd5b9190910192915050565b600062ffffff82168061446d5761446d614185565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156144a1576144a1614185565b8260016001607f1b03190382128116156144bd576144bd614185565b50019392505050565b60006001600160401b038083168185168083038211156144e8576144e8614185565b01949350505050565b600081600019048311821515161561450b5761450b614185565b500290565b60008282101561452257614522614185565b500390565b6000825161444e818460208701614313565b60006020828403121561454b57600080fd5b5051919050565b80516020808301519190811015613ad85760001960209190910360031b1b16919050565b60008351614588818460208801614313565b6001600160801b0319939093169190920190815260100192915050565b6000816145b4576145b4614185565b506000190190565b600081600f0b60016001607f1b03198114156145da576145da614185565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460957614609614185565b600160ff1b600087128281168783058912161561462857614628614185565b6000871292508782058712848416161561464457614644614185565b8785058712818416161561465a5761465a614185565b505050929093029392505050565b600064ffffffffff80841680614680576146806143d2565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b7576146b7614185565b8160016001607f1b030183138116156146d2576146d2614185565b5090039392505050565b600064ffffffffff808416806146f4576146f46143d2565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472457614724614185565b02949350505050565b602081526000613732602083018461434356fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220ce16b3a1e7b54ca6a388dca2755175e8af312a0288f82dc2dbe1d4f71327b0ae64736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b50604051620049b2380380620049b2833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147946200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da701528181610f660152818161106b0152818161130b01528181611757015281816119000152612f9a015260008181610483015261113601526147946000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613adc565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9a565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c68565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc4565b610e11565b6040516101d99190613d3d565b34801561041957600080fd5b5061042d610428366004613d4b565b610e76565b6040516101d99190613d64565b34801561044657600080fd5b50610400610455366004613d4b565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dba565b610f23565b6101a36104d3366004613dd7565b611060565b3480156104e457600080fd5b5061042d6104f3366004613cc4565b61120d565b34801561050457600080fd5b506101a3610513366004613e6a565b611300565b34801561052457600080fd5b506101a3610533366004613e96565b61153d565b34801561054457600080fd5b506101a3610553366004613f87565b611714565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614058565b6118e7565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c0565b1561067e5760405162461bcd60e51b8152600401610675906140dd565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c0565b156107275760405162461bcd60e51b8152600401610675906140dd565b600061076d610736858061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d05565b60028111156107ed576107ed613d05565b8152505090506212750081604001516001600160401b031661080f9190614199565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d05565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5e92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d88565b87611f3d565b610a0b86356109f7878061413a565b610a0460208a018a6141b1565b8651612098565b610a1560006122af565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c0565b15610af15760405162461bcd60e51b8152600401610675906140dd565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d88565b89611f3d565b6000805b87811015610d7d57610d5f8a358a8a84818110610cfd57610cfd61423f565b9050602002016020810190610d129190614255565b898985818110610d2457610d2461423f565b9050602002810190610d3691906141b1565b898987818110610d4857610d4861423f565b9050602002810190610d5a919061413a565b612531565b610d699083614199565b915080610d758161427c565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0957610f09613d05565b6002811115610f1a57610f1a613d05565b90525092915050565b6033546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd991906140c0565b15610ff65760405162461bcd60e51b8152600401610675906140dd565b610fff826122af565b603454600160401b900460ff1661105c576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a85760405162461bcd60e51b815260040161067590614297565b346801bc16d674ec800000146111345760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611177612b78565b8888886040518863ffffffff1660e01b815260040161119b9695949392919061436d565b6000604051808303818588803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111fe9291906143bc565b60405180910390a15050505050565b6112356040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e5576112e5613d05565b60028111156112f6576112f6613d05565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113485760405162461bcd60e51b815260040161067590614297565b611356633b9aca00826143e6565b156113e05760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f0633b9aca00836143fa565b6034549091506001600160401b0390811690821611156114a95760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c79084906001600160401b031661440e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152691815260200190565b60405180910390a26115388383612bbd565b505050565b600054610100900460ff161580801561155d5750600054600160ff909116105b806115775750303b158015611577575060005460ff166001145b6115da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fd576000805461ff0019166101001790555b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173e5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906140c0565b156117e75760405162461bcd60e51b8152600401610675906140dd565b82518451146118725760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e0576118ce838583815181106118945761189461423f565b60200260200101518784815181106118ae576118ae61423f565b60200260200101516001600160a01b0316612bc79092919063ffffffff16565b806118d88161427c565b915050611875565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561194f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197391906140c0565b156119905760405162461bcd60e51b8152600401610675906140dd565b603a54600160401b90046001600160401b031680611a3c5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8c9087612c19565b6000805b85811015611ce05736878783818110611aab57611aab61423f565b9050602002810190611abd9190614436565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2e57611b2e613d05565b6002811115611b3f57611b3f613d05565b9052509050600181606001516002811115611b5c57611b5c613d05565b14611b68575050611cce565b856001600160401b031681604001516001600160401b031610611b8c575050611cce565b600080611b9c83898e3587612d95565b602089018051929450909250611bb182614456565b62ffffff16905250606087018051839190611bcd908390614475565b600f0b905250611bdd81876144c4565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8257611c82613d05565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd88161427c565b915050611a90565b506001600160401b038084166000908152603b6020526040812080548493919291611d0d918591166144c4565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb7565b600081600081518110611d4f57611d4f61423f565b60200260200101519050919050565b600081600381518110611d7357611d7361423f565b60200260200101516000801b14159050919050565b6000611d97611fff600c6144ef565b611daa6001600160401b0384164261450e565b10611e145760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5c91614525565b600060405180830381855afa9150503d8060008114611e97576040519150601f19603f3d011682016040523d82523d6000602084013e611e9c565b606091505b5091509150818015611eaf575060008151115b611f215760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f359190614537565b949350505050565b611f49600360206144ef565b611f5660208301836141b1565b905014611fcb5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201b611fdb60208301836141b1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130be565b61105c5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121135760405162461bcd60e51b815260206004820152604e602482015260008051602061473f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561212160286001614199565b61212b9190614199565b6121369060206144ef565b82146121a45760405162461bcd60e51b8152602060048201526043602482015260008051602061473f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e28686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d692505050565b9050600064ffffffffff83166121fa60286001614199565b600b901b17905061224585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130be565b6122a55760405162461bcd60e51b815260206004820152603d602482015260008051602061473f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123505760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d55760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f2633b9aca00476143fa565b6123fc919061440e565b905081801561241257506001600160401b038116155b156124855760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249b42611d88565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f681612eb7565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612570848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125df576125df613d05565b60028111156125f0576125f0613d05565b905250905060008160600151600281111561260d5761260d613d05565b146126b05760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338392505050565b6001600160401b0316146127805760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612788612b78565b61279190614550565b6127cd8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a892505050565b1461284e5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bd92505050565b905061289c8a87878b8b8e612098565b603980549060006128ac8361427c565b9091555050603a54600090600160401b90046001600160401b0316156128e457603a54600160401b90046001600160401b03166128f1565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c7576129c7613d05565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a6f633b9aca006001600160401b0384166144ef565b9b9a5050505050505050505050565b60008151603014612b075760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1e908490600090602001614574565b60408051601f1981840301815290829052612b3891614525565b602060405180830381855afa158015612b55573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e709190614537565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105c82826133d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115389084906134ee565b612c2560056003614199565b612c309060206144ef565b612c3d60208301836141b1565b905014612cc05760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d11612cd260208401846141b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130be565b6115385760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612dad8784886135c0565b9050816001600160401b0316816001600160401b031614612e2757612dd28183613737565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612eab5760398054906000612e55836145a3565b9091555050600260608a0152612e6a856145ba565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff1661303e576000633b9aca00826060015183604001516001600160401b0316612ee99190614475565b600f0b612ef691906145e1565b6040830151603480549293509091600090612f1b9084906001600160401b03166144c4565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130cc86858561374f565b1495945050505050565b600080600283516130e791906143fa565b90506000816001600160401b0381111561310357613103613eb3565b60405190808252806020026020018201604052801561312c578160200160208202803683370190505b50905060005b828110156132335760028561314783836144ef565b815181106131575761315761423f565b60200260200101518683600261316d91906144ef565b613178906001614199565b815181106131885761318861423f565b60200260200101516040516020016131aa929190918252602082015260400190565b60408051601f19818403018152908290526131c491614525565b602060405180830381855afa1580156131e1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132049190614537565b8282815181106132165761321661423f565b60209081029190910101528061322b8161427c565b915050613132565b5061323f6002836143fa565b91505b811561335f5760005b8281101561334c5760028261326083836144ef565b815181106132705761327061423f565b60200260200101518383600261328691906144ef565b613291906001614199565b815181106132a1576132a161423f565b60200260200101516040516020016132c3929190918252602082015260400190565b60408051601f19818403018152908290526132dd91614525565b602060405180830381855afa1580156132fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331d9190614537565b82828151811061332f5761332f61423f565b6020908102919091010152806133448161427c565b91505061324b565b506133586002836143fa565b9150613242565b806000815181106133725761337261423f565b602002602001015192505050919050565b6000610e708260068151811061339b5761339b61423f565b602002602001015161389b565b600081600181518110611d4f57611d4f61423f565b6000610e708260028151811061339b5761339b61423f565b804710156134255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50509050806115385760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613543826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139029092919063ffffffff16565b805190915015611538578080602001905181019061356191906140c0565b6115385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ce60266001614199565b6135d99060206144ef565b6135e660408401846141b1565b9050146136575760405162461bcd60e51b81526020600482015260446024820181905260008051602061473f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613664600485614666565b64ffffffffff1690506136be61367d60408501856141b1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130be565b61371e5760405162461bcd60e51b815260206004820152603e602482015260008051602061473f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372c836020013585613911565b9150505b9392505050565b60006137306001600160401b0380841690851661468a565b6000835160001415801561376e57506020845161376c91906143e6565b155b6137fd5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613891576138216002856143e6565b613854578151600052808601516020526020826040600060026107d05a03fa61384957600080fd5b60028404935061387f565b8086015160005281516020526020826040600060026107d05a03fa61387857600080fd5b6002840493505b61388a602082614199565b905061380e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f35848460008561393e565b60008061391f6004846146da565b61392a9060406146fe565b64ffffffffff169050611f3584821b61389b565b60608247101561399f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a129190614525565b60006040518083038185875af1925050503d8060008114613a4f576040519150601f19603f3d011682016040523d82523d6000602084013e613a54565b606091505b5091509150613a64828286613a6f565b979650505050505050565b60608315613a7e575081613730565b825115613a8e5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472b565b80356001600160401b0381168114613abf57600080fd5b919050565b600060408284031215613ad657600080fd5b50919050565b600080600060608486031215613af157600080fd5b613afa84613aa8565b925060208401356001600160401b0380821115613b1657600080fd5b613b2287838801613ac4565b93506040860135915080821115613b3857600080fd5b50613b4586828701613ac4565b9150509250925092565b60008083601f840112613b6157600080fd5b5081356001600160401b03811115613b7857600080fd5b6020830191508360208260051b8501011115613b9357600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb657600080fd5b613bbf89613aa8565b975060208901356001600160401b0380821115613bdb57600080fd5b613be78c838d01613ac4565b985060408b0135915080821115613bfd57600080fd5b613c098c838d01613b4f565b909850965060608b0135915080821115613c2257600080fd5b613c2e8c838d01613b4f565b909650945060808b0135915080821115613c4757600080fd5b50613c548b828c01613b4f565b999c989b5096995094979396929594505050565b600060208284031215613c7a57600080fd5b61373082613aa8565b60008083601f840112613c9557600080fd5b5081356001600160401b03811115613cac57600080fd5b602083019150836020828501011115613b9357600080fd5b60008060208385031215613cd757600080fd5b82356001600160401b03811115613ced57600080fd5b613cf985828601613c83565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3957634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e708284613d1b565b600060208284031215613d5d57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da56060840182613d1b565b5092915050565b80151581146130bb57600080fd5b600060208284031215613dcc57600080fd5b813561373081613dac565b600080600080600060608688031215613def57600080fd5b85356001600160401b0380821115613e0657600080fd5b613e1289838a01613c83565b90975095506020880135915080821115613e2b57600080fd5b50613e3888828901613c83565b96999598509660400135949350505050565b6001600160a01b03811681146130bb57600080fd5b8035613abf81613e4a565b60008060408385031215613e7d57600080fd5b8235613e8881613e4a565b946020939093013593505050565b600060208284031215613ea857600080fd5b813561373081613e4a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef157613ef1613eb3565b604052919050565b60006001600160401b03821115613f1257613f12613eb3565b5060051b60200190565b600082601f830112613f2d57600080fd5b81356020613f42613f3d83613ef9565b613ec9565b82815260059290921b84018101918181019086841115613f6157600080fd5b8286015b84811015613f7c5780358352918301918301613f65565b509695505050505050565b600080600060608486031215613f9c57600080fd5b83356001600160401b0380821115613fb357600080fd5b818601915086601f830112613fc757600080fd5b81356020613fd7613f3d83613ef9565b82815260059290921b8401810191818101908a841115613ff657600080fd5b948201945b8386101561401d57853561400e81613e4a565b82529482019490820190613ffb565b9750508701359250508082111561403357600080fd5b5061404086828701613f1c565b92505061404f60408501613e5f565b90509250925092565b60008060006040848603121561406d57600080fd5b83356001600160401b038082111561408457600080fd5b61409087838801613ac4565b945060208601359150808211156140a657600080fd5b506140b386828701613b4f565b9497909650939450505050565b6000602082840312156140d257600080fd5b815161373081613dac565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415157600080fd5b8301803591506001600160401b0382111561416b57600080fd5b6020019150600581901b3603821315613b9357600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ac576141ac614183565b500190565b6000808335601e198436030181126141c857600080fd5b8301803591506001600160401b038211156141e257600080fd5b602001915036819003821315613b9357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426757600080fd5b813564ffffffffff8116811461373057600080fd5b600060001982141561429057614290614183565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432c578181015183820152602001614314565b8381111561433b576000848401525b50505050565b60008151808452614359816020860160208601614311565b601f01601f19169290920160200192915050565b60808152600061438160808301888a6142e8565b82810360208401526143938188614341565b905082810360408401526143a88186886142e8565b915050826060830152979650505050505050565b602081526000611f356020830184866142e8565b634e487b7160e01b600052601260045260246000fd5b6000826143f5576143f56143d0565b500690565b600082614409576144096143d0565b500490565b60006001600160401b038381169083168181101561442e5761442e614183565b039392505050565b60008235605e1983360301811261444c57600080fd5b9190910192915050565b600062ffffff82168061446b5761446b614183565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561449f5761449f614183565b8260016001607f1b03190382128116156144bb576144bb614183565b50019392505050565b60006001600160401b038083168185168083038211156144e6576144e6614183565b01949350505050565b600081600019048311821515161561450957614509614183565b500290565b60008282101561452057614520614183565b500390565b6000825161444c818460208701614311565b60006020828403121561454957600080fd5b5051919050565b80516020808301519190811015613ad65760001960209190910360031b1b16919050565b60008351614586818460208801614311565b6001600160801b0319939093169190920190815260100192915050565b6000816145b2576145b2614183565b506000190190565b600081600f0b60016001607f1b03198114156145d8576145d8614183565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460757614607614183565b600160ff1b600087128281168783058912161561462657614626614183565b6000871292508782058712848416161561464257614642614183565b8785058712818416161561465857614658614183565b505050929093029392505050565b600064ffffffffff8084168061467e5761467e6143d0565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b5576146b5614183565b8160016001607f1b030183138116156146d0576146d0614183565b5090039392505050565b600064ffffffffff808416806146f2576146f26143d0565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472257614722614183565b02949350505050565b602081526000613730602083018461434156fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220f36012bb88f1c9174fbcd179803dbdc4f13532a7db8e80a11ea031dfc5967b7964736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 727ec2be9..f878dc296 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -14,7 +14,6 @@ import "../libraries/Endian.sol"; import "../interfaces/IETHPOSDeposit.sol"; import "../interfaces/IEigenPodManager.sol"; -import "../interfaces/IDelayedWithdrawalRouter.sol"; import "../interfaces/IPausable.sol"; import "./EigenPodPausingConstants.sol"; @@ -32,7 +31,7 @@ contract EigenPod is Initializable, ReentrancyGuardUpgradeable, EigenPodPausingConstants, - EigenPodStorage + EigenPodStorage { using BytesLib for bytes; @@ -282,7 +281,6 @@ contract EigenPod is uint256 totalAmountToBeRestakedWei; for (uint256 i = 0; i < validatorIndices.length; i++) { totalAmountToBeRestakedWei += _verifyWithdrawalCredentials( - beaconTimestamp, stateRootProof.beaconStateRoot, validatorIndices[i], validatorFieldsProofs[i], @@ -409,13 +407,11 @@ contract EigenPod is /** * @notice internal function that proves an individual validator's withdrawal credentials - * @param beaconTimestamp is the timestamp whose state root the `proof` will be proven against. * @param validatorIndex is the index of the validator being proven * @param validatorFieldsProof is the bytes that prove the ETH validator's withdrawal credentials against a beacon chain state root * @param validatorFields are the fields of the "Validator Container", refer to consensus specs */ function _verifyWithdrawalCredentials( - uint64 beaconTimestamp, bytes32 beaconStateRoot, uint40 validatorIndex, bytes calldata validatorFieldsProof, @@ -470,7 +466,6 @@ contract EigenPod is emit ValidatorRestaked(validatorIndex); emit ValidatorBalanceUpdated(validatorIndex, lastCheckpointedAt, restakedBalanceGwei); - return restakedBalanceGwei * GWEI_TO_WEI; } diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol index cd57c557b..488272bd6 100644 --- a/src/test/EigenPod.t.sol +++ b/src/test/EigenPod.t.sol @@ -395,46 +395,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { return (timestamp - GOERLI_GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; } - function testWithdrawNonBeaconChainETHBalanceWei() public { - revert("TODO"); - // IEigenPod pod = testDeployAndVerifyNewEigenPod(); - - // cheats.deal(address(podOwner), 10 ether); - // emit log_named_address("Pod:", address(pod)); - - // uint256 balanceBeforeDeposit = pod.nonBeaconChainETHBalanceWei(); - - // (bool sent, ) = payable(address(pod)).call{value: 1 ether}(""); - - // require(sent == true, "not sent"); - - // uint256 balanceAfterDeposit = pod.nonBeaconChainETHBalanceWei(); - - // require( - // balanceBeforeDeposit < balanceAfterDeposit - // && (balanceAfterDeposit - balanceBeforeDeposit) == 1 ether, - // "increment checks" - // ); - - // cheats.startPrank(podOwner, podOwner); - // cheats.expectEmit(true, true, true, true, address(pod)); - // emit NonBeaconChainETHWithdrawn(podOwner, 1 ether); - // pod.withdrawNonBeaconChainETHBalanceWei( - // podOwner, - // 1 ether - // ); - - // uint256 balanceAfterWithdrawal = pod.nonBeaconChainETHBalanceWei(); - - // require( - // balanceAfterWithdrawal < balanceAfterDeposit - // && balanceAfterWithdrawal == balanceBeforeDeposit, - // "decrement checks" - // ); - - // cheats.stopPrank(); - } - function testDeployAndVerifyNewEigenPod() public returns (IEigenPod) { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); @@ -529,38 +489,6 @@ contract EigenPodTests is ProofParsing, EigenPodPausingConstants { cheats.stopPrank(); } - function testBalanceProofWithWrongTimestamp(uint64 timestamp) public { - revert("TODO"); - // cheats.assume(timestamp > GOERLI_GENESIS_TIME); - // // ./solidityProofGen "BalanceUpdateProof" 302913 false 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_notOverCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // IEigenPod newPod = testDeployAndVerifyNewEigenPod(); - - // // ./solidityProofGen "BalanceUpdateProof" 302913 true 0 "data/withdrawal_proof_goerli/goerli_slot_6399999.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "balanceUpdateProof_overCommitted_302913.json" - // setJSON("./src/test/test-data/balanceUpdateProof_updated_to_0ETH_302913.json"); - // // prove overcommitted balance - // cheats.warp(timestamp); - // _proveOverCommittedStake(newPod); - - - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - - // bytes memory proof = abi.encodePacked(getBalanceUpdateProof()); - // bytes[] memory proofs = new bytes[](1); - // proofs[0] = proof; - - // bytes32 newLatestBlockRoot = getLatestBlockRoot(); - // BeaconChainOracleMock(address(beaconChainOracle)).setOracleBlockRootAtTimestamp(newLatestBlockRoot); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp")); - // newPod.verifyBalanceUpdates(uint64(block.timestamp - 1), validatorIndices, stateRootProofStruct, proofs, validatorFieldsArray); - } - function testProveSingleWithdrawalCredential() public { // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); diff --git a/src/test/events/IEigenPodEvents.sol b/src/test/events/IEigenPodEvents.sol index 20d37557f..172e3ca3f 100644 --- a/src/test/events/IEigenPodEvents.sol +++ b/src/test/events/IEigenPodEvents.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.12; interface IEigenPodEvents { - /// @notice Emitted when an ETH validator stakes via this eigenPod + // @notice Emitted when an ETH validator stakes via this eigenPod event EigenPodStaked(bytes pubkey); /// @notice Emitted when an ETH validator's withdrawal credentials are successfully verified to be pointed to this eigenPod @@ -12,22 +12,6 @@ interface IEigenPodEvents { // is the validator's balance that is credited on EigenLayer. event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newValidatorBalanceGwei); - /// @notice Emitted when an ETH validator is prove to have withdrawn from the beacon chain - event FullWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 withdrawalAmountGwei - ); - - /// @notice Emitted when a partial withdrawal claim is successfully redeemed - event PartialWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 partialWithdrawalAmountGwei - ); - /// @notice Emitted when restaked beacon chain ETH is withdrawn from the eigenPod. event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount); @@ -37,6 +21,15 @@ interface IEigenPodEvents { /// @notice Emitted when ETH is received via the `receive` fallback event NonBeaconChainETHReceived(uint256 amountReceived); - /// @notice Emitted when ETH that was previously received via the `receive` fallback is withdrawn - event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn); + /// @notice Emitted when a checkpoint is created + event CheckpointCreated(uint64 indexed checkpointTimestamp, bytes32 indexed beaconBlockRoot); + + /// @notice Emitted when a checkpoint is finalized + event CheckpointFinalized(uint64 indexed checkpointTimestamp, int256 totalShareDeltaWei); + + /// @notice Emitted when a validator is proven for a given checkpoint + event ValidatorCheckpointed(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); + + /// @notice Emitted when a validaor is proven to have 0 balance at a given checkpoint + event ValidatorWithdrawn(uint64 indexed checkpointTimestamp, uint40 indexed validatorIndex); } diff --git a/src/test/harnesses/EigenPodHarness.sol b/src/test/harnesses/EigenPodHarness.sol index 2e937e488..f76e00e1f 100644 --- a/src/test/harnesses/EigenPodHarness.sol +++ b/src/test/harnesses/EigenPodHarness.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; import "../../contracts/pods/EigenPod.sol"; import "forge-std/Test.sol"; -contract EigenPodHarness is EigenPod, Test { +contract EigenPodHarness is EigenPod { constructor( IETHPOSDeposit _ethPOS, @@ -25,14 +25,12 @@ contract EigenPodHarness is EigenPod, Test { } function verifyWithdrawalCredentials( - uint64 oracleTimestamp, bytes32 beaconStateRoot, uint40 validatorIndex, bytes calldata validatorFieldsProof, bytes32[] calldata validatorFields ) public returns (uint256) { return _verifyWithdrawalCredentials( - oracleTimestamp, beaconStateRoot, validatorIndex, validatorFieldsProof, diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index b6cca32d7..1d4a5c675 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -361,7 +361,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Create time machine and beacon chain. Set block time to beacon chain genesis time cheats.warp(GENESIS_TIME_LOCAL); timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_LOCAL); + beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_LOCAL); } /** @@ -665,7 +665,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // Create time machine and mock beacon chain timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_MAINNET); + beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET); } else if (forkType == HOLESKY) { revert("_deployOrFetchContracts - holesky tests currently broken sorry"); // cheats.selectFork(holeskyForkId); @@ -695,7 +695,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ); // Create time machine and mock beacon chain timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(timeMachine, eigenPodManager, GENESIS_TIME_MAINNET); + beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET); cheats.startPrank(executorMultisig); eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 3600fcab9..58656303b 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -7,7 +7,6 @@ import "src/contracts/libraries/BeaconChainProofs.sol"; import "src/contracts/libraries/Merkle.sol"; import "src/contracts/pods/EigenPodManager.sol"; -import "src/test/integration/TimeMachine.t.sol"; import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol"; import "src/test/integration/utils/PrintUtils.t.sol"; @@ -33,6 +32,12 @@ struct CredentialProofs { bytes32[][] validatorFields; } +struct StaleBalanceProofs { + uint64 beaconTimestamp; + BeaconChainProofs.StateRootProof stateRootProof; + BeaconChainProofs.ValidatorProof validatorProof; +} + contract BeaconChainMock is PrintUtils { Vm cheats = Vm(HEVM_ADDRESS); @@ -116,7 +121,7 @@ contract BeaconChainMock is PrintUtils { bytes32[] zeroNodes; - constructor(TimeMachine timeMachine, EigenPodManager _eigenPodManager, uint64 _genesisTime) { + constructor(EigenPodManager _eigenPodManager, uint64 _genesisTime) { genesisTime = _genesisTime; eigenPodManager = _eigenPodManager; @@ -799,6 +804,7 @@ contract BeaconChainMock is PrintUtils { vFields[BeaconChainProofs.VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = bytes32(v.withdrawalCreds); vFields[BeaconChainProofs.VALIDATOR_BALANCE_INDEX] = _toLittleEndianUint64(v.effectiveBalanceGwei); vFields[BeaconChainProofs.VALIDATOR_EXIT_EPOCH_INDEX] = _toLittleEndianUint64(v.exitEpoch); + vFields[BeaconChainProofs.VALIDATOR_SLASHED_INDEX] = bytes32(abi.encode(v.isSlashed)); return vFields; } @@ -941,6 +947,18 @@ contract BeaconChainMock is PrintUtils { return proofs; } + function getStaleBalanceProofs(uint40 validatorIndex) public view returns (StaleBalanceProofs memory) { + ValidatorFieldsProof memory vfProof = validatorFieldsProofs[curTimestamp][validatorIndex]; + return StaleBalanceProofs({ + beaconTimestamp: curTimestamp, + stateRootProof: stateRootProofs[curTimestamp], + validatorProof: BeaconChainProofs.ValidatorProof({ + validatorFields: vfProof.validatorFields, + proof: vfProof.validatorFieldsProof + }) + }); + } + function balanceOfGwei(uint40 validatorIndex) public view returns (uint64) { return validators[validatorIndex].effectiveBalanceGwei; } diff --git a/src/test/mocks/EigenPodManagerMock.sol b/src/test/mocks/EigenPodManagerMock.sol index 06d03afea..127fcc49a 100644 --- a/src/test/mocks/EigenPodManagerMock.sol +++ b/src/test/mocks/EigenPodManagerMock.sol @@ -3,14 +3,20 @@ pragma solidity ^0.8.9; import "forge-std/Test.sol"; import "../../contracts/interfaces/IEigenPodManager.sol"; +import "../../contracts/permissions/Pausable.sol"; -contract EigenPodManagerMock is IEigenPodManager, Test { + +contract EigenPodManagerMock is IEigenPodManager, Test, Pausable { IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); IBeacon public eigenPodBeacon; IETHPOSDeposit public ethPOS; mapping(address => int256) public podShares; + constructor(IPauserRegistry _pauserRegistry) { + _initializePauser(_pauserRegistry, 0); + } + function slasher() external view returns(ISlasher) {} function createPod() external returns(address) {} @@ -35,26 +41,6 @@ contract EigenPodManagerMock is IEigenPodManager, Test { return false; } - function pause(uint256 /*newPausedStatus*/) external{} - - function pauseAll() external{} - - function paused() external pure returns (uint256) { - return 0; - } - - function paused(uint8 /*index*/) external pure returns (bool) { - return false; - } - - function setPauserRegistry(IPauserRegistry /*newPauserRegistry*/) external {} - - function pauserRegistry() external pure returns (IPauserRegistry) { - return IPauserRegistry(address(0)); - } - - function unpause(uint256 /*newPausedStatus*/) external{} - function podOwnerShares(address podOwner) external view returns (int256) { return podShares[podOwner]; } diff --git a/src/test/tree/EigenPodUnit.tree b/src/test/tree/EigenPodUnit.tree index 92a2c4e45..9e142df40 100644 --- a/src/test/tree/EigenPodUnit.tree +++ b/src/test/tree/EigenPodUnit.tree @@ -4,39 +4,6 @@ │ └── it should properly set storage ├── when initialize called again │ └── it should revert -├── // Balance Update Tree -├── when verifyBalanceUpdates is called *** -│ ├── given that balance updates are paused -│ │ └── it should revert -│ ├── given that the indices and proofs are different lengths -│ │ └── it should revert -│ ├── given that the oracle timestamp is stale -│ │ └── it should revert -│ ├── given that the beacon state root proof is invalid -│ │ └── it should revert -│ └── given that the above conditions are satisfied -│ ├── it should call _verifyBalanceUpdate for each balance update -│ └── it should record a beaconChainETH balance update in the EPM -├── when _verifyBalanceUpdate is called (internal function) -│ ├── given that the most recent balance update timestamp is greater than or equal to the oracle timestamp -│ │ └── it should revert -│ ├── given that the validator status is not active -│ │ └── it should revert -│ ├── given that the validator withdrawable epoch is less than or equal to the epoch of the oracle timestamp -│ │ └── given that the validator balance is equal to 0 -│ │ └── it should revert -│ ├── given that the validator fields proof is not valid -│ │ └── it should revert -│ ├── given that the validator balances proof is not valid -│ │ └── it should revert -│ └── given that the above conditions are satisfied -│ ├── given that the validator restaked balance is greater than the max restaked balance per validator -│ │ └── it should set the new restaked balance to the validator restaked balance -│ ├── given that the validator restaked balance is less than or equal to the max restaked balance per validator -│ │ └── it should set the new restaked balance to the validator restaked balance -│ ├── it should update the _validatorPubkeyHashToInfo mapping with the new restaked balance -│ └── given that the new restaked balance is not equal to the validator restaked balance -│ └── it should emit a validator balance updated event and return a non-zero sharesDeltaGwei ├── // EigenPodManager Caller Tree ├── when stake is called │ ├── given the caller is not the EigenPodManager @@ -73,99 +40,95 @@ │ ├── it should call _verifyWithdrawalCredentials for each validator │ └── it should record a beaconChainETH balance update in the EPM ├── when _verifyWithdrawalCredentials is called (internal function) -│ ├── given that the validators status is inactive +│ ├── given that the validators status is not INACTIVE +│ │ └── it should revert +│ ├── given that the validator is currently in the process of fully exiting │ │ └── it should revert │ ├── given that validator's withdrawal credentials does not correspond to the pod withdrawal credentials │ │ └── it should revert │ ├── given that the validator fields proof is not valid │ │ └── it should revert │ └── given that all the above conditions are satisfied -│ ├── given that the validator effective balance is greater than the max restaked balance -│ │ └── it should set the validator restaked balance to the max restaked balance -│ ├── given that the validator effective balance is less than or equal to the max restaked balance -│ │ └── it should set the validator restaked balance to the validator effective balance -│ ├── it should update the _validatorPubkeyHashToInfo mapping with an active validator and restaked balance +│ ├── it should set the validator's restaked balance to their effective balance +│ ├── it should update the _validatorPubkeyHashToInfo mapping with an active validator, restaked balance in gwei, and lastCheckpointedAt timestamp │ ├── it should emit ValidatorRestaked and ValidatorBalanceUpdated Events -│ └── It should return the validator's restakedBalance in wei -├── when withdrawNonBeaconChainETHBalanceWei is called -│ ├── given that the caller is not the eigen pod owner -│ │ └── it should revert -│ ├── given that the amount to withdraw is greater than the non-beacon chain eth balance -│ │ └── it should revert -│ └── given the above conditions pass -│ └── it should emit a non beacon chain eth withdrawn event and send eth to the delayed withdrawal router +│ └── it should return the validator's restakedBalance in wei ├── when recoverTokens is called │ ├── given that the caller is not the eigen pod owner │ │ └── it should revert +│ ├── given that non proof withdrawals are paused +│ │ └── it should revert │ ├── given that the tokens and amounts to withdraw are different lengths │ │ └── it should revert │ └── given that the above conditions pass │ └── it should transfer tokens to the recipient -├── when activate restaking is called -│ ├── given that the eigenpods verify credentials is not paused *** -│ │ └── it should revert +├── // Checkpointing Tree +├── when startCheckpoint is called │ ├── given that the caller is not the eigen pod owner │ │ └── it should revert -│ ├── given that hasRestaked is true +│ ├── given that start checkpoints is not paused │ │ └── it should revert -│ └── given that all the above conditions pass -│ └── it should set hasRestaked to true, process a withdrawal of ETH to the delayed withdrawal router, and emit a RestakingActivated event -├── when withdrawBeforeRestaking is called -│ ├── given that the caller is not the eigen pod owner +│ ├── it should call _startCheckpoint +│ └── given _startCheckpoint does not revert +│ └── given hasRestaked is false +│ └── it should set hasRestaked to true and emit RestakingActivated +├── when _startCheckpoint is called +│ ├── given a current checkpoint is in progress, currentCheckpointTimestamp != 0 │ │ └── it should revert -│ ├── given that has restaked is true +│ ├── given the last checkpoint occurred in the same block, lastCheckpointTimestamp == block.timestamp │ │ └── it should revert -│ └── given that the above conditions pass -│ └── it should process a withdrawal of eth to the delayed withdrawal router -├── // Withdrawal Tree -├── when verifyAndProcessWithdrawals is called *** -│ ├── given that verifying withdrawals are paused +│ ├── given revertIfNoBalance is true and the pod has no increase balance in gwei │ │ └── it should revert -│ ├── given that validatorFields, validatorProofs, withdrawalProofs, withdrawalFields, are different lengths -│ │ └── it should revert -│ ├── given that the beacon state root proof is invalid -│ │ └── it should revert -│ ├── given that the above conditions are satisfied -│ ├── it should call _verifyAndProcessWithdrawal -│ ├── given that the amount of ETH to withdraw immediately is greater than 0 -│ │ └── it should send the ETH to the delayed withdrawal router -│ └── given that the pod's shares have are not 0 -│ └── it should record a beacon chain balance update in the EPM -└── when _verifyAndProcessWithdrawal is called (internal function) - ├── given that the proof timestamp is stale +│ └── given that the above conditions pass +│ ├── it should set the currentCheckpointTimestamp to the current block timestamp +│ ├── it should set the currentCheckpoint with the parentBlockRoot at block.timestamp and with the current activeValidatorCount +│ └── it should emit CheckpointCreated +├── when verifyCheckpointProofs is called +│ ├── given that verify checkpoint proofs is paused +│ │ └── it should revert +│ ├── given there is no currently active checkpoint, currentCheckpointTimestamp == 0 +│ │ └── it should revert +│ ├── given the balanceContainerProof does not match with the current checkpoint beaconBlockRoot +│ │ └── it should revert +│ ├── for each balanceProof, it should process the respective validator accordingly +│ │ ├── given the validator is not active +│ │ │ └── it should continue to next validator proof +│ │ ├── given the validator last checkpointed timestamp is >= currentCheckpointTimestamp +│ │ │ └── it should continue to next validator proof +│ │ └── given _verifyCheckpointProof does not revert +│ │ └── it should decrement proofsRemaining, add to balanceDeltasGwei, add to exitedBalancesGwei +│ └── given that all above checkpoint proofs pass +│ └── it should update checkpointBalanceExitedGwei at the checkpoint timestamp and call _updateCheckpoint +├── when _verifyCheckpointProof is called +│ ├── given verifyValidatorBalance does not match with balanceContainerRoot +│ │ └── it should revert +│ └── it should return the balanceDeltaGwei and exitedBalanceGwei if the validator did a full exit +├── when _updateCheckpoint is called +│ ├── given there are still proofs remaining for the checkpoint +│ │ └── it should update the current checkpoint +│ └── given there are 0 proofs remaining for the checkpoint +│ ├── it should update the lastCheckpointTimestamp with currentCheckpointTimestamp +│ ├── it should delete currentCheckpointTimestamp resetting it to 0 +│ ├── it should delete the currentCheckpoint +│ ├── it should recordBeaconChainBalanceUpdate on the EPM with the total delta of shares in wei +│ └── it should emit CheckpointFinalized +├── when _getParentBlockRoot is called +│ ├── given the provided timestamp is out of range, HISTORY_BUFFER_LENGTH * 12seconds +│ │ └── it should revert +│ └── given the slot at the provided timestamp was skipped +│ └── it should revert +└── when verifyStaleBalance is called + ├── given that verify stale balance is paused + │ └── it should revert + ├── given that the validator last checkpointed timestamp is not stale enough (2 weeks) │ └── it should revert - ├── given that the status of the validator is inactive + ├── given that the validator status is not ACTIVE │ └── it should revert - ├── given that the withdrawalTimestamp has already been proven for the validator + ├── given that the validator has not been slashed │ └── it should revert - ├── given that the withdrawal proof is invalid + ├── given that the beacon state root proof does not match the beaconBlockRoot at the given beaconTimestamp │ └── it should revert - ├── given that the validator fields proof is invalid + ├── given the validator container proof does not match the beacon state root │ └── it should revert - └── given that the above conditions are satisfied - ├── it should set the withdrawal timestamp as proven for the validator pubKey - ├── given that the epoch of the proof is after the withdrawable epoch - │ ├── it should call _processFullWithdrawal - │ └── when _processFullWithdrawal is called (internal function) - │ ├── given that the withdrawalAmount is greater than the max restaked balance per validator - │ │ └── it should set the amount to queue to the max restaked balance per validator - │ ├── given that the withdrawalAmount is less than or equal to the max restaked balance per validator - │ │ └── it should set the amount to queue to the withdrawal amount - │ ├── it should set the amount of ETH to withdraw via the delayed withdrawal router as the difference between the withdrawalAmount and amount to queue - │ ├── it should increment withdrawableRestakedExecutionLayerGwei by the amount to queue - │ ├── it should update the sharesDelta of the withdrawal as the difference between the amount to queue and the previous restaked balance - │ ├── it should update the _validatorPubkeyHashToInfo mapping with a restaked balance of 0 and status as withdrawn - │ └── it should emit a FullWithdrawalRedeemed event and return the verified withdrawal struct - └── given that the epoch of the proof is before the withdrawable epoch - ├── it should call _processPartialWithdrawal - └── when _processPartialWithdrawal is called (internal function) - ├── it should emit a PartialWithdrawalRedeemed event - ├── it should increment the sumOfPartialWithdrawalsClaimedGwei variable - └── it should return the verified withdrawal struct - -// Tests in Integration -// Pausing Functionality -// verifyWithdrawalCredentials (external) -// verifyBalanceUpdates (external) -// verifyAndProcessWithdrawals(external) -// Withdraw restaked beacon chain ETH after withdrawing \ No newline at end of file + └── given that all the above conditions pass + └── it should call _startCheckpoint with revertIfNoBalance set to false \ No newline at end of file diff --git a/src/test/unit/DelayedWithdrawalRouterUnit.t.sol b/src/test/unit/DelayedWithdrawalRouterUnit.t.sol index 848d1319e..75c1458ad 100644 --- a/src/test/unit/DelayedWithdrawalRouterUnit.t.sol +++ b/src/test/unit/DelayedWithdrawalRouterUnit.t.sol @@ -13,462 +13,463 @@ import "../mocks/Reenterer.sol"; import "forge-std/Test.sol"; +/// @notice Deprecated contract for ETH withdrawals from EigenPods contract DelayedWithdrawalRouterUnitTests is Test { - Vm cheats = Vm(HEVM_ADDRESS); + // Vm cheats = Vm(HEVM_ADDRESS); - ProxyAdmin public proxyAdmin; - PauserRegistry public pauserRegistry; + // ProxyAdmin public proxyAdmin; + // PauserRegistry public pauserRegistry; - EigenPodManagerMock public eigenPodManagerMock; + // EigenPodManagerMock public eigenPodManagerMock; - DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; - DelayedWithdrawalRouter public delayedWithdrawalRouter; + // DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; + // DelayedWithdrawalRouter public delayedWithdrawalRouter; - Reenterer public reenterer; + // Reenterer public reenterer; - address public pauser = address(555); - address public unpauser = address(999); + // address public pauser = address(555); + // address public unpauser = address(999); - address initialOwner = address(this); + // address initialOwner = address(this); - uint224[] public delayedWithdrawalAmounts; + // uint224[] public delayedWithdrawalAmounts; - uint256 internal _pseudorandomNumber; + // uint256 internal _pseudorandomNumber; - // index for flag that pauses withdrawals (i.e. 'delayedWithdrawal claims') when set - uint8 internal constant PAUSED_PAYMENT_CLAIMS = 0; + // // index for flag that pauses withdrawals (i.e. 'delayedWithdrawal claims') when set + // uint8 internal constant PAUSED_PAYMENT_CLAIMS = 0; - mapping(address => bool) public addressIsExcludedFromFuzzedInputs; + // mapping(address => bool) public addressIsExcludedFromFuzzedInputs; - modifier filterFuzzedAddressInputs(address fuzzedAddress) { - cheats.assume(!addressIsExcludedFromFuzzedInputs[fuzzedAddress]); - _; - } + // modifier filterFuzzedAddressInputs(address fuzzedAddress) { + // cheats.assume(!addressIsExcludedFromFuzzedInputs[fuzzedAddress]); + // _; + // } - /// @notice Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); + // /// @notice Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. + // event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); - /// @notice event for delayedWithdrawal creation - event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index); + // /// @notice event for delayedWithdrawal creation + // event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index); - /// @notice event for the claiming of delayedWithdrawals - event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted); + // /// @notice event for the claiming of delayedWithdrawals + // event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted); - function setUp() external { - proxyAdmin = new ProxyAdmin(); + // function setUp() external { + // proxyAdmin = new ProxyAdmin(); - address[] memory pausers = new address[](1); - pausers[0] = pauser; - pauserRegistry = new PauserRegistry(pausers, unpauser); + // address[] memory pausers = new address[](1); + // pausers[0] = pauser; + // pauserRegistry = new PauserRegistry(pausers, unpauser); - eigenPodManagerMock = new EigenPodManagerMock(); - - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManagerMock); - - uint256 initPausedStatus = 0; - uint256 withdrawalDelayBlocks = delayedWithdrawalRouterImplementation.MAX_WITHDRAWAL_DELAY_BLOCKS(); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address( - new TransparentUpgradeableProxy( - address(delayedWithdrawalRouterImplementation), - address(proxyAdmin), - abi.encodeWithSelector(DelayedWithdrawalRouter.initialize.selector, initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks) - ) - ) - ); - - reenterer = new Reenterer(); - - // exclude the zero address, the proxyAdmin, and this contract from fuzzed inputs - addressIsExcludedFromFuzzedInputs[address(0)] = true; - addressIsExcludedFromFuzzedInputs[address(proxyAdmin)] = true; - addressIsExcludedFromFuzzedInputs[address(this)] = true; - } - - function testCannotReinitialize() external { - uint256 initPausedStatus = 0; - uint256 withdrawalDelayBlocks = delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS(); - cheats.expectRevert(bytes("Initializable: contract is already initialized")); - delayedWithdrawalRouter.initialize(initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks); - } - - function testCreateDelayedWithdrawalNonzeroAmount(uint224 delayedWithdrawalAmount, address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { - cheats.assume(delayedWithdrawalAmount != 0); - cheats.assume(recipient != address(0)); - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - - address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - cheats.deal(podAddress, delayedWithdrawalAmount); - cheats.startPrank(podAddress); - uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(recipient); - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalCreated(podOwner, recipient, delayedWithdrawalAmount, userWithdrawalsLength); - delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); - cheats.stopPrank(); - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - - require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length + 1, - "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length + 1"); - - IDelayedWithdrawalRouter.DelayedWithdrawal memory delayedWithdrawal = userWithdrawalsAfter.delayedWithdrawals[userWithdrawalsAfter.delayedWithdrawals.length - 1]; - require(delayedWithdrawal.amount == delayedWithdrawalAmount, "delayedWithdrawal.amount != delayedWithdrawalAmount"); - require(delayedWithdrawal.blockCreated == block.number, "delayedWithdrawal.blockCreated != block.number"); - } - - - function testCreateDelayedWithdrawalZeroAmount(address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { - cheats.assume(recipient != address(0)); - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - uint224 delayedWithdrawalAmount = 0; - cheats.assume(recipient != address(0)); - address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - cheats.deal(podAddress, delayedWithdrawalAmount); - cheats.startPrank(podAddress); - delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); - cheats.stopPrank(); - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - - // verify that no new 'delayedWithdrawal' was created - require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length, - "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length"); - } - - function testCreateDelayedWithdrawalZeroAddress(address podOwner) external filterFuzzedAddressInputs(podOwner) { - uint224 delayedWithdrawalAmount = 0; - address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - cheats.assume(podAddress != address(proxyAdmin)); - cheats.startPrank(podAddress); - cheats.expectRevert(bytes("DelayedWithdrawalRouter.createDelayedWithdrawal: recipient cannot be zero address")); - delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); - } - - function testCreateDelayedWithdrawalFromNonPodAddress(address podOwner, address nonPodAddress) external filterFuzzedAddressInputs(podOwner) filterFuzzedAddressInputs(nonPodAddress) { - uint224 delayedWithdrawalAmount = 0; - address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - cheats.assume(nonPodAddress != podAddress); - cheats.assume(nonPodAddress != address(proxyAdmin)); - - cheats.startPrank(nonPodAddress); - cheats.expectRevert(bytes("DelayedWithdrawalRouter.onlyEigenPod: not podOwner's EigenPod")); - delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); - } - - function testClaimDelayedWithdrawals( - uint8 delayedWithdrawalsToCreate, - uint8 maxNumberOfDelayedWithdrawalsToClaim, - uint256 pseudorandomNumber_, - address recipient, - bool useOverloadedFunction - ) - public filterFuzzedAddressInputs(recipient) - { - // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function - cheats.assume(!Address.isContract(recipient)); - // filter out precompile addresses (they won't accept delayedWithdrawal either) - cheats.assume(uint160(recipient) > 256); - // filter fuzzed inputs to avoid running out of gas & excessive test run-time - cheats.assume(delayedWithdrawalsToCreate <= 32); - - address podOwner = address(88888); - - // create the delayedWithdrawals - _pseudorandomNumber = pseudorandomNumber_; - uint8 delayedWithdrawalsCreated; - for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - if (delayedWithdrawalAmount != 0) { - testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - delayedWithdrawalsCreated += 1; - } - } - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - uint256 userBalanceBefore = recipient.balance; - - // pre-condition check - require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated, "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated"); - - // roll forward the block number enough to make the delayedWithdrawals claimable - cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); - - // find the expected number of completed withdrawals and the expected total withdrawal amount - uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = - (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated) ? delayedWithdrawalsCreated : maxNumberOfDelayedWithdrawalsToClaim; - uint256 totalDelayedWithdrawalAmount = 0; - for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { - totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; - } - - // claim the delayedWithdrawals - if (delayedWithdrawalsCreated != 0) { - if (useOverloadedFunction) { - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - } else { - cheats.startPrank(recipient); - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - cheats.stopPrank(); - } - } - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - uint256 userBalanceAfter = recipient.balance; - - // post-conditions - require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, - "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); - require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, - "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); - } - - /// @notice This function is used to test the getter function 'getClaimableDelayedWithdrawals' - function testDelayedWithdrawalsGetterFunctions(uint8 delayedWithdrawalsToCreate, uint224 delayedWithdrawalAmount, address recipient) - public filterFuzzedAddressInputs(recipient) - { - cheats.assume(delayedWithdrawalAmount != 0); - cheats.assume(delayedWithdrawalsToCreate > 5); - // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function - cheats.assume(!Address.isContract(recipient)); - // filter out precompile addresses (they won't accept delayedWithdrawal either) - cheats.assume(uint160(recipient) > 256); - // filter fuzzed inputs to avoid running out of gas & excessive test run-time - cheats.assume(delayedWithdrawalsToCreate <= 32); - - address podOwner = address(88888); - - // create the delayedWithdrawals - uint8 delayedWithdrawalsCreated; - for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - delayedWithdrawalsCreated += 1; - cheats.roll(block.number + 1); // make sure each delayedWithdrawal has a unique block number - } - - require(delayedWithdrawalRouter.getUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, "Incorrect number delayed withdrawals"); - - cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() - delayedWithdrawalsToCreate); - for (uint256 i = 1; i <= delayedWithdrawalsToCreate; ++i) { - uint256 length = delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length; - require(length == i, "Incorrect number of claimable delayed withdrawals"); - cheats.roll(block.number + 1); - } - require(delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, - "Incorrect number of claimable delayed withdrawals"); - } - - - /** - * @notice Creates a set of delayedWithdrawals of length (2 * `delayedWithdrawalsToCreate`), - * where only the first half is claimable, claims using `maxNumberOfDelayedWithdrawalsToClaim` input, - * and checks that only appropriate delayedWithdrawals were claimed. - */ - function testClaimDelayedWithdrawalsSomeUnclaimable(uint8 delayedWithdrawalsToCreate, uint8 maxNumberOfDelayedWithdrawalsToClaim, bool useOverloadedFunction) - external - { - // filter fuzzed inputs to avoid running out of gas & excessive test run-time - cheats.assume(delayedWithdrawalsToCreate <= 32); - - address podOwner = address(88888); - address recipient = address(22222); - - // create the first set of delayedWithdrawals - _pseudorandomNumber = 1554; - uint256 delayedWithdrawalsCreated_1; - for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - if (delayedWithdrawalAmount != 0) { - testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - delayedWithdrawalsCreated_1 += 1; - } - } - - // roll forward the block number half of the delay window - cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); - - // create the second set of delayedWithdrawals - uint256 delayedWithdrawalsCreated_2; - for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - if (delayedWithdrawalAmount != 0) { - testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - delayedWithdrawalsCreated_2 += 1; - } - } - - // roll forward the block number half of the delay window -- the first set of delayedWithdrawals should now be claimable, while the second shouldn't be! - cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - uint256 userBalanceBefore = recipient.balance; - - // pre-condition check - require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2, - "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2"); - - // find the expected number of completed withdrawals and the expected total withdrawal amount - uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = - (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated_1) ? delayedWithdrawalsCreated_1 : maxNumberOfDelayedWithdrawalsToClaim; - uint256 totalDelayedWithdrawalAmount = 0; - for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { - totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; - } - - // claim the delayedWithdrawals - if (delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2 != 0) { - if (useOverloadedFunction) { - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - } else { - cheats.startPrank(recipient); - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - cheats.stopPrank(); - } - } - - IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - uint256 userBalanceAfter = recipient.balance; - - // post-conditions - require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, - "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); - require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, - "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); - } - - function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - uint8 delayedWithdrawalsToCreate = 0; - uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; - address recipient = address(22222); - testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - } - - function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimNonzero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - uint8 delayedWithdrawalsToCreate = 0; - uint8 maxNumberOfDelayedWithdrawalsToClaim = 2; - address recipient = address(22222); - testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - } - - function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - uint8 delayedWithdrawalsToCreate = 2; - uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; - address recipient = address(22222); - testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - } - - function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimNonzero( - uint8 maxNumberOfDelayedWithdrawalsToClaim, uint256 pseudorandomNumber_, bool useOverloadedFunction - )external { - uint8 delayedWithdrawalsToCreate = 2; - address recipient = address(22222); - testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - } - - function testClaimDelayedWithdrawals_RevertsOnAttemptingReentrancy(bool useOverloadedFunction) external { - uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; - address recipient = address(reenterer); - address podOwner = address(reenterer); - - // create the delayedWithdrawal - uint224 delayedWithdrawalAmount = 123; - testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - - // roll forward the block number enough to make the delayedWithdrawal claimable - cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); - - // prepare the Reenterer contract - address targetToUse = address(delayedWithdrawalRouter); - uint256 msgValueToUse = 0; - bytes memory expectedRevertDataToUse = bytes("ReentrancyGuard: reentrant call"); - bytes memory callDataToUse; - if (useOverloadedFunction) { - callDataToUse = abi.encodeWithSignature( - "claimDelayedWithdrawals(address,uint256)", address(22222), maxNumberOfDelayedWithdrawalsToClaim); - } else { - callDataToUse = abi.encodeWithSignature( - "claimDelayedWithdrawals(uint256)", maxNumberOfDelayedWithdrawalsToClaim); - } - reenterer.prepare(targetToUse, msgValueToUse, callDataToUse, expectedRevertDataToUse); - - if (useOverloadedFunction) { - delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - } else { - cheats.startPrank(recipient); - delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - cheats.stopPrank(); - } - } - - function testClaimDelayedWithdrawals_RevertsWhenPaused(bool useOverloadedFunction) external { - uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; - address recipient = address(22222); - - // pause delayedWithdrawal claims - cheats.startPrank(pauser); - delayedWithdrawalRouter.pause(2 ** PAUSED_PAYMENT_CLAIMS); - cheats.stopPrank(); - - cheats.expectRevert(bytes("Pausable: index is paused")); - if (useOverloadedFunction) { - delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - } else { - cheats.startPrank(recipient); - delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - cheats.stopPrank(); - } - } - - function testSetWithdrawalDelayBlocks(uint16 valueToSet) external { - // filter fuzzed inputs to allowed amounts - cheats.assume(valueToSet <= delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); - - // set the `withdrawalDelayBlocks` variable - cheats.startPrank(delayedWithdrawalRouter.owner()); - uint256 previousValue = delayedWithdrawalRouter.withdrawalDelayBlocks(); - cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - emit WithdrawalDelayBlocksSet(previousValue, uint256(valueToSet)); - delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - cheats.stopPrank(); - require(delayedWithdrawalRouter.withdrawalDelayBlocks() == valueToSet, "delayedWithdrawalRouter.withdrawalDelayBlocks() != valueToSet"); - } - - function testSetWithdrawalDelayBlocksRevertsWhenCalledByNotOwner(address notOwner) filterFuzzedAddressInputs(notOwner) external { - cheats.assume(notOwner != delayedWithdrawalRouter.owner()); - - uint256 valueToSet = 1; - // set the `withdrawalDelayBlocks` variable - cheats.startPrank(notOwner); - cheats.expectRevert(bytes("Ownable: caller is not the owner")); - delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - cheats.stopPrank(); - } - - function testSetWithdrawalDelayBlocksRevertsWhenInputValueTooHigh(uint256 valueToSet) external { - // filter fuzzed inputs to disallowed amounts - cheats.assume(valueToSet > delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); - - // attempt to set the `withdrawalDelayBlocks` variable - cheats.startPrank(delayedWithdrawalRouter.owner()); - cheats.expectRevert(bytes("DelayedWithdrawalRouter._setWithdrawalDelayBlocks: newValue too large")); - delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - } - - function _getPseudorandomNumber() internal returns (uint256) { - _pseudorandomNumber = uint256(keccak256(abi.encode(_pseudorandomNumber))); - return _pseudorandomNumber; - } + // eigenPodManagerMock = new EigenPodManagerMock(); + + // delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManagerMock); + + // uint256 initPausedStatus = 0; + // uint256 withdrawalDelayBlocks = delayedWithdrawalRouterImplementation.MAX_WITHDRAWAL_DELAY_BLOCKS(); + // delayedWithdrawalRouter = DelayedWithdrawalRouter( + // address( + // new TransparentUpgradeableProxy( + // address(delayedWithdrawalRouterImplementation), + // address(proxyAdmin), + // abi.encodeWithSelector(DelayedWithdrawalRouter.initialize.selector, initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks) + // ) + // ) + // ); + + // reenterer = new Reenterer(); + + // // exclude the zero address, the proxyAdmin, and this contract from fuzzed inputs + // addressIsExcludedFromFuzzedInputs[address(0)] = true; + // addressIsExcludedFromFuzzedInputs[address(proxyAdmin)] = true; + // addressIsExcludedFromFuzzedInputs[address(this)] = true; + // } + + // function testCannotReinitialize() external { + // uint256 initPausedStatus = 0; + // uint256 withdrawalDelayBlocks = delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS(); + // cheats.expectRevert(bytes("Initializable: contract is already initialized")); + // delayedWithdrawalRouter.initialize(initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks); + // } + + // function testCreateDelayedWithdrawalNonzeroAmount(uint224 delayedWithdrawalAmount, address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { + // cheats.assume(delayedWithdrawalAmount != 0); + // cheats.assume(recipient != address(0)); + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); + + // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); + // cheats.deal(podAddress, delayedWithdrawalAmount); + // cheats.startPrank(podAddress); + // uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(recipient); + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalCreated(podOwner, recipient, delayedWithdrawalAmount, userWithdrawalsLength); + // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); + // cheats.stopPrank(); + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); + + // require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length + 1, + // "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length + 1"); + + // IDelayedWithdrawalRouter.DelayedWithdrawal memory delayedWithdrawal = userWithdrawalsAfter.delayedWithdrawals[userWithdrawalsAfter.delayedWithdrawals.length - 1]; + // require(delayedWithdrawal.amount == delayedWithdrawalAmount, "delayedWithdrawal.amount != delayedWithdrawalAmount"); + // require(delayedWithdrawal.blockCreated == block.number, "delayedWithdrawal.blockCreated != block.number"); + // } + + + // function testCreateDelayedWithdrawalZeroAmount(address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { + // cheats.assume(recipient != address(0)); + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); + // uint224 delayedWithdrawalAmount = 0; + // cheats.assume(recipient != address(0)); + // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); + // cheats.deal(podAddress, delayedWithdrawalAmount); + // cheats.startPrank(podAddress); + // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); + // cheats.stopPrank(); + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); + + // // verify that no new 'delayedWithdrawal' was created + // require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length, + // "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length"); + // } + + // function testCreateDelayedWithdrawalZeroAddress(address podOwner) external filterFuzzedAddressInputs(podOwner) { + // uint224 delayedWithdrawalAmount = 0; + // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); + // cheats.assume(podAddress != address(proxyAdmin)); + // cheats.startPrank(podAddress); + // cheats.expectRevert(bytes("DelayedWithdrawalRouter.createDelayedWithdrawal: recipient cannot be zero address")); + // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); + // } + + // function testCreateDelayedWithdrawalFromNonPodAddress(address podOwner, address nonPodAddress) external filterFuzzedAddressInputs(podOwner) filterFuzzedAddressInputs(nonPodAddress) { + // uint224 delayedWithdrawalAmount = 0; + // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); + // cheats.assume(nonPodAddress != podAddress); + // cheats.assume(nonPodAddress != address(proxyAdmin)); + + // cheats.startPrank(nonPodAddress); + // cheats.expectRevert(bytes("DelayedWithdrawalRouter.onlyEigenPod: not podOwner's EigenPod")); + // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); + // } + + // function testClaimDelayedWithdrawals( + // uint8 delayedWithdrawalsToCreate, + // uint8 maxNumberOfDelayedWithdrawalsToClaim, + // uint256 pseudorandomNumber_, + // address recipient, + // bool useOverloadedFunction + // ) + // public filterFuzzedAddressInputs(recipient) + // { + // // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function + // cheats.assume(!Address.isContract(recipient)); + // // filter out precompile addresses (they won't accept delayedWithdrawal either) + // cheats.assume(uint160(recipient) > 256); + // // filter fuzzed inputs to avoid running out of gas & excessive test run-time + // cheats.assume(delayedWithdrawalsToCreate <= 32); + + // address podOwner = address(88888); + + // // create the delayedWithdrawals + // _pseudorandomNumber = pseudorandomNumber_; + // uint8 delayedWithdrawalsCreated; + // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { + // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); + // if (delayedWithdrawalAmount != 0) { + // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); + // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); + // delayedWithdrawalsCreated += 1; + // } + // } + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); + // uint256 userBalanceBefore = recipient.balance; + + // // pre-condition check + // require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated, "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated"); + + // // roll forward the block number enough to make the delayedWithdrawals claimable + // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); + + // // find the expected number of completed withdrawals and the expected total withdrawal amount + // uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = + // (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated) ? delayedWithdrawalsCreated : maxNumberOfDelayedWithdrawalsToClaim; + // uint256 totalDelayedWithdrawalAmount = 0; + // for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { + // totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; + // } + + // // claim the delayedWithdrawals + // if (delayedWithdrawalsCreated != 0) { + // if (useOverloadedFunction) { + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); + // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); + // } else { + // cheats.startPrank(recipient); + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); + // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); + // cheats.stopPrank(); + // } + // } + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); + // uint256 userBalanceAfter = recipient.balance; + + // // post-conditions + // require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, + // "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); + // require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, + // "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); + // } + + // /// @notice This function is used to test the getter function 'getClaimableDelayedWithdrawals' + // function testDelayedWithdrawalsGetterFunctions(uint8 delayedWithdrawalsToCreate, uint224 delayedWithdrawalAmount, address recipient) + // public filterFuzzedAddressInputs(recipient) + // { + // cheats.assume(delayedWithdrawalAmount != 0); + // cheats.assume(delayedWithdrawalsToCreate > 5); + // // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function + // cheats.assume(!Address.isContract(recipient)); + // // filter out precompile addresses (they won't accept delayedWithdrawal either) + // cheats.assume(uint160(recipient) > 256); + // // filter fuzzed inputs to avoid running out of gas & excessive test run-time + // cheats.assume(delayedWithdrawalsToCreate <= 32); + + // address podOwner = address(88888); + + // // create the delayedWithdrawals + // uint8 delayedWithdrawalsCreated; + // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { + // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); + // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); + // delayedWithdrawalsCreated += 1; + // cheats.roll(block.number + 1); // make sure each delayedWithdrawal has a unique block number + // } + + // require(delayedWithdrawalRouter.getUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, "Incorrect number delayed withdrawals"); + + // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() - delayedWithdrawalsToCreate); + // for (uint256 i = 1; i <= delayedWithdrawalsToCreate; ++i) { + // uint256 length = delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length; + // require(length == i, "Incorrect number of claimable delayed withdrawals"); + // cheats.roll(block.number + 1); + // } + // require(delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, + // "Incorrect number of claimable delayed withdrawals"); + // } + + + // /** + // * @notice Creates a set of delayedWithdrawals of length (2 * `delayedWithdrawalsToCreate`), + // * where only the first half is claimable, claims using `maxNumberOfDelayedWithdrawalsToClaim` input, + // * and checks that only appropriate delayedWithdrawals were claimed. + // */ + // function testClaimDelayedWithdrawalsSomeUnclaimable(uint8 delayedWithdrawalsToCreate, uint8 maxNumberOfDelayedWithdrawalsToClaim, bool useOverloadedFunction) + // external + // { + // // filter fuzzed inputs to avoid running out of gas & excessive test run-time + // cheats.assume(delayedWithdrawalsToCreate <= 32); + + // address podOwner = address(88888); + // address recipient = address(22222); + + // // create the first set of delayedWithdrawals + // _pseudorandomNumber = 1554; + // uint256 delayedWithdrawalsCreated_1; + // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { + // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); + // if (delayedWithdrawalAmount != 0) { + // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); + // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); + // delayedWithdrawalsCreated_1 += 1; + // } + // } + + // // roll forward the block number half of the delay window + // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); + + // // create the second set of delayedWithdrawals + // uint256 delayedWithdrawalsCreated_2; + // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { + // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); + // if (delayedWithdrawalAmount != 0) { + // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); + // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); + // delayedWithdrawalsCreated_2 += 1; + // } + // } + + // // roll forward the block number half of the delay window -- the first set of delayedWithdrawals should now be claimable, while the second shouldn't be! + // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); + // uint256 userBalanceBefore = recipient.balance; + + // // pre-condition check + // require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2, + // "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2"); + + // // find the expected number of completed withdrawals and the expected total withdrawal amount + // uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = + // (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated_1) ? delayedWithdrawalsCreated_1 : maxNumberOfDelayedWithdrawalsToClaim; + // uint256 totalDelayedWithdrawalAmount = 0; + // for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { + // totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; + // } + + // // claim the delayedWithdrawals + // if (delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2 != 0) { + // if (useOverloadedFunction) { + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); + // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); + // } else { + // cheats.startPrank(recipient); + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); + // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); + // cheats.stopPrank(); + // } + // } + + // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); + // uint256 userBalanceAfter = recipient.balance; + + // // post-conditions + // require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, + // "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); + // require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, + // "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); + // } + + // function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { + // uint8 delayedWithdrawalsToCreate = 0; + // uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; + // address recipient = address(22222); + // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); + // } + + // function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimNonzero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { + // uint8 delayedWithdrawalsToCreate = 0; + // uint8 maxNumberOfDelayedWithdrawalsToClaim = 2; + // address recipient = address(22222); + // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); + // } + + // function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { + // uint8 delayedWithdrawalsToCreate = 2; + // uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; + // address recipient = address(22222); + // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); + // } + + // function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimNonzero( + // uint8 maxNumberOfDelayedWithdrawalsToClaim, uint256 pseudorandomNumber_, bool useOverloadedFunction + // )external { + // uint8 delayedWithdrawalsToCreate = 2; + // address recipient = address(22222); + // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); + // } + + // function testClaimDelayedWithdrawals_RevertsOnAttemptingReentrancy(bool useOverloadedFunction) external { + // uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; + // address recipient = address(reenterer); + // address podOwner = address(reenterer); + + // // create the delayedWithdrawal + // uint224 delayedWithdrawalAmount = 123; + // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); + + // // roll forward the block number enough to make the delayedWithdrawal claimable + // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); + + // // prepare the Reenterer contract + // address targetToUse = address(delayedWithdrawalRouter); + // uint256 msgValueToUse = 0; + // bytes memory expectedRevertDataToUse = bytes("ReentrancyGuard: reentrant call"); + // bytes memory callDataToUse; + // if (useOverloadedFunction) { + // callDataToUse = abi.encodeWithSignature( + // "claimDelayedWithdrawals(address,uint256)", address(22222), maxNumberOfDelayedWithdrawalsToClaim); + // } else { + // callDataToUse = abi.encodeWithSignature( + // "claimDelayedWithdrawals(uint256)", maxNumberOfDelayedWithdrawalsToClaim); + // } + // reenterer.prepare(targetToUse, msgValueToUse, callDataToUse, expectedRevertDataToUse); + + // if (useOverloadedFunction) { + // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); + // } else { + // cheats.startPrank(recipient); + // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); + // cheats.stopPrank(); + // } + // } + + // function testClaimDelayedWithdrawals_RevertsWhenPaused(bool useOverloadedFunction) external { + // uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; + // address recipient = address(22222); + + // // pause delayedWithdrawal claims + // cheats.startPrank(pauser); + // delayedWithdrawalRouter.pause(2 ** PAUSED_PAYMENT_CLAIMS); + // cheats.stopPrank(); + + // cheats.expectRevert(bytes("Pausable: index is paused")); + // if (useOverloadedFunction) { + // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); + // } else { + // cheats.startPrank(recipient); + // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); + // cheats.stopPrank(); + // } + // } + + // function testSetWithdrawalDelayBlocks(uint16 valueToSet) external { + // // filter fuzzed inputs to allowed amounts + // cheats.assume(valueToSet <= delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); + + // // set the `withdrawalDelayBlocks` variable + // cheats.startPrank(delayedWithdrawalRouter.owner()); + // uint256 previousValue = delayedWithdrawalRouter.withdrawalDelayBlocks(); + // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); + // emit WithdrawalDelayBlocksSet(previousValue, uint256(valueToSet)); + // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); + // cheats.stopPrank(); + // require(delayedWithdrawalRouter.withdrawalDelayBlocks() == valueToSet, "delayedWithdrawalRouter.withdrawalDelayBlocks() != valueToSet"); + // } + + // function testSetWithdrawalDelayBlocksRevertsWhenCalledByNotOwner(address notOwner) filterFuzzedAddressInputs(notOwner) external { + // cheats.assume(notOwner != delayedWithdrawalRouter.owner()); + + // uint256 valueToSet = 1; + // // set the `withdrawalDelayBlocks` variable + // cheats.startPrank(notOwner); + // cheats.expectRevert(bytes("Ownable: caller is not the owner")); + // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); + // cheats.stopPrank(); + // } + + // function testSetWithdrawalDelayBlocksRevertsWhenInputValueTooHigh(uint256 valueToSet) external { + // // filter fuzzed inputs to disallowed amounts + // cheats.assume(valueToSet > delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); + + // // attempt to set the `withdrawalDelayBlocks` variable + // cheats.startPrank(delayedWithdrawalRouter.owner()); + // cheats.expectRevert(bytes("DelayedWithdrawalRouter._setWithdrawalDelayBlocks: newValue too large")); + // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); + // } + + // function _getPseudorandomNumber() internal returns (uint256) { + // _pseudorandomNumber = uint256(keccak256(abi.encode(_pseudorandomNumber))); + // return _pseudorandomNumber; + // } } diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index aa041cf06..064ab3064 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -5,6 +5,7 @@ import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; import "src/contracts/pods/EigenPod.sol"; +import "src/contracts/pods/EigenPodPausingConstants.sol"; import "src/test/mocks/ETHDepositMock.sol"; import "src/test/mocks/DelayedWithdrawalRouterMock.sol"; @@ -14,44 +15,55 @@ import "src/test/utils/ProofParsing.sol"; import "src/test/utils/EigenLayerUnitTestSetup.sol"; import "src/test/events/IEigenPodEvents.sol"; -contract EigenPodUnitTests is EigenLayerUnitTestSetup { +import "src/test/integration/mocks/BeaconChainMock.t.sol"; +import "src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol"; +import "src/test/utils/EigenPodUser.t.sol"; +import "src/test/events/IEigenPodEvents.sol"; + + +contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, IEigenPodEvents { + using Strings for *; + using BytesLib for bytes; + using BeaconChainProofs for *; + // Contract Under Test: EigenPod EigenPod public eigenPod; EigenPod public podImplementation; IBeacon public eigenPodBeacon; - // Mocks - IETHPOSDeposit public ethPOSDepositMock; - IDelayedWithdrawalRouter public delayedWithdrawalRouterMock; + // BeaconChain Mock Setup + TimeMachine public timeMachine; + ETHPOSDepositMock ethPOSDepositMock; + BeaconChainMock public beaconChain; + EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02); - // Address of pod for which proofs were generated - address podAddress = address(0x49c486E3f4303bc11C02F952Fe5b08D0AB22D443); + uint256 public numStakers; + // Beacon chain genesis time when running locally + // Multiple of 12 for sanity's sake + uint64 constant GENESIS_TIME_LOCAL = 1 hours * 12; + uint256 constant TIME_TILL_STALE_BALANCE = 2 weeks; - bool IS_DENEB = false; - - // Constants - // uint64 public constant RESTAKED_BALANCE_OFFSET_GWEI = 75e7; - uint64 public constant GOERLI_GENESIS_TIME = 1616508000; - // uint64 public constant SECONDS_PER_SLOT = 12; bytes internal constant beaconProxyBytecode = hex"608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564"; - address public podOwner = address(this); function setUp() public override virtual { // Setup EigenLayerUnitTestSetup.setUp(); - // Deploy mocks + // Create time machine and beacon chain. Set block time to beacon chain genesis time + // beaconChainMock will also etch 4788 precompile ethPOSDepositMock = new ETHPOSDepositMock(); - delayedWithdrawalRouterMock = new DelayedWithdrawalRouterMock(); + cheats.warp(GENESIS_TIME_LOCAL); + timeMachine = new TimeMachine(); + beaconChain = new BeaconChainMock(EigenPodManager(address(eigenPodManagerMock)), GENESIS_TIME_LOCAL); // Deploy EigenPod podImplementation = new EigenPod( ethPOSDepositMock, eigenPodManagerMock, - GOERLI_GENESIS_TIME + GENESIS_TIME_LOCAL ); // Deploy Beacon @@ -66,10 +78,8 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { abi.encodePacked(beaconProxyBytecode, abi.encode(eigenPodBeacon, "")) ))); - // Etch the eigenPod code to the address for which proofs are generated - bytes memory code = address(eigenPod).code; - cheats.etch(podAddress, code); - eigenPod = EigenPod(payable(podAddress)); + // Etch 4788 precompile + cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode); // Store the eigenPodBeacon address in the eigenPod beacon proxy bytes32 beaconSlot = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; @@ -79,6 +89,9 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { eigenPod.initialize(address(this)); } + /******************************************************************************* + EIGENPOD Helpers + *******************************************************************************/ /// @notice Post-M2, all new deployed eigen pods will have restaked set to true modifier hasNotRestaked() { @@ -88,23 +101,268 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup { cheats.store(address(eigenPod), slot, value); _; } + + modifier timewarp() { + uint curState = timeMachine.warpToLast(); + _; + timeMachine.warpToPresent(curState); + } + + function _seedPodWithETH(uint256 ethAmount) internal { + cheats.deal(address(this), ethAmount); + bool result; + bytes memory data; + (result, data) = address(eigenPod).call{value: ethAmount}(""); + } + + function _setPodHasNotRestaked(EigenPodUser staker) internal { + // Write hasRestaked as false. hasRestaked in slot 52 + bytes32 slot = bytes32(uint256(52)); + bytes32 value = bytes32(0); // 0 == false + cheats.store(address(staker.pod()), slot, value); + } + + function _newEigenPodStaker(uint256 rand) internal returns (EigenPodUser, uint256) { + string memory stakerName; + + EigenPodUser staker; + + stakerName = string.concat("Staker", numStakers.toString()); + staker = new EigenPodUser(stakerName); + + uint256 amount = bound(rand, 1 ether, 640 ether); + cheats.deal(address(staker), amount); + + numStakers++; + return (staker, amount); + } + + /******************************************************************************* + verifyWithdrawalCredentials Assertions + *******************************************************************************/ + + function assert_Snap_Added_ActiveValidatorCount( + EigenPodUser staker, + uint addedValidators, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(prevActiveValidatorCount + addedValidators, curActiveValidatorCount, err); + } + + function assert_Snap_Removed_ActiveValidatorCount( + EigenPodUser staker, + uint removedValidators, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(curActiveValidatorCount + removedValidators, prevActiveValidatorCount, err); + } + + function assert_Snap_Unchanged_ActiveValidatorCount( + EigenPodUser staker, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(curActiveValidatorCount, prevActiveValidatorCount, err); + } + + function _getActiveValidatorCount(EigenPodUser staker) internal view returns (uint) { + EigenPod pod = staker.pod(); + return pod.activeValidatorCount(); + } + + function _getPrevActiveValidatorCount(EigenPodUser staker) internal timewarp() returns (uint) { + return _getActiveValidatorCount(staker); + } + + function assert_Snap_Added_ActiveValidators( + EigenPodUser staker, + uint40[] memory addedValidators, + string memory err + ) internal { + bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(addedValidators); + + IEigenPod.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + IEigenPod.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + + for (uint i = 0; i < curStatuses.length; i++) { + assertTrue(prevStatuses[i] == IEigenPod.VALIDATOR_STATUS.INACTIVE, err); + assertTrue(curStatuses[i] == IEigenPod.VALIDATOR_STATUS.ACTIVE, err); + } + } + + function assert_Snap_Removed_ActiveValidators( + EigenPodUser staker, + uint40[] memory removedValidators, + string memory err + ) internal { + bytes32[] memory pubkeyHashes = beaconChain.getPubkeyHashes(removedValidators); + + IEigenPod.VALIDATOR_STATUS[] memory curStatuses = _getValidatorStatuses(staker, pubkeyHashes); + IEigenPod.VALIDATOR_STATUS[] memory prevStatuses = _getPrevValidatorStatuses(staker, pubkeyHashes); + + for (uint i = 0; i < curStatuses.length; i++) { + assertTrue(prevStatuses[i] == IEigenPod.VALIDATOR_STATUS.ACTIVE, err); + assertTrue(curStatuses[i] == IEigenPod.VALIDATOR_STATUS.WITHDRAWN, err); + } + } + + function _getValidatorStatuses(EigenPodUser staker, bytes32[] memory pubkeyHashes) internal view returns (IEigenPod.VALIDATOR_STATUS[] memory) { + EigenPod pod = staker.pod(); + IEigenPod.VALIDATOR_STATUS[] memory statuses = new IEigenPod.VALIDATOR_STATUS[](pubkeyHashes.length); + + for (uint i = 0; i < statuses.length; i++) { + statuses[i] = pod.validatorStatus(pubkeyHashes[i]); + } + + return statuses; + } + + function _getPrevValidatorStatuses(EigenPodUser staker, bytes32[] memory pubkeyHashes) internal timewarp() returns (IEigenPod.VALIDATOR_STATUS[] memory) { + return _getValidatorStatuses(staker, pubkeyHashes); + } + + /******************************************************************************* + startCheckpoint Assertions + *******************************************************************************/ + + function check_StartCheckpoint_State( + EigenPodUser staker + ) internal { + assert_ProofsRemainingEqualsActive(staker, "checkpoint proofs remaining should equal active validator count"); + assert_Snap_Created_Checkpoint(staker, "staker should have created a new checkpoint"); + } + + function assert_ProofsRemainingEqualsActive( + EigenPodUser staker, + string memory err + ) internal { + EigenPod pod = staker.pod(); + assertEq(pod.currentCheckpoint().proofsRemaining, pod.activeValidatorCount(), err); + } + + function assert_Snap_Created_Checkpoint( + EigenPodUser staker, + string memory err + ) internal { + uint64 curCheckpointTimestamp = _getCheckpointTimestamp(staker); + uint64 prevCheckpointTimestamp = _getPrevCheckpointTimestamp(staker); + + assertEq(prevCheckpointTimestamp, 0, err); + assertTrue(curCheckpointTimestamp != 0, err); + } + + function _getCheckpointTimestamp(EigenPodUser staker) internal view returns (uint64) { + EigenPod pod = staker.pod(); + return pod.currentCheckpointTimestamp(); + } + + function _getPrevCheckpointTimestamp(EigenPodUser staker) internal timewarp() returns (uint64) { + return _getCheckpointTimestamp(staker); + } + + /******************************************************************************* + verifyCheckpointProofs + *******************************************************************************/ + + /// @notice assumes positive rewards and that the checkpoint will be finalized + function _expectEventsVerifyCheckpointProofs( + EigenPodUser staker, + uint40[] memory validators, + BeaconChainProofs.BalanceProof[] memory proofs + ) internal { + EigenPod pod = staker.pod(); + int256 totalBalanceDeltaGWei = 0; + uint64 checkpointTimestamp = pod.currentCheckpointTimestamp(); + for (uint i = 0; i < validators.length; i++) { + IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(proofs[i].pubkeyHash); + uint64 prevBalanceGwei = info.restakedBalanceGwei; + uint64 newBalanceGwei = BeaconChainProofs.getBalanceAtIndex(proofs[i].balanceRoot, validators[i]); + int128 balanceDeltaGwei = _calcBalanceDelta({ + newAmountGwei: newBalanceGwei, + previousAmountGwei: prevBalanceGwei + }); + if (newBalanceGwei != prevBalanceGwei) { + cheats.expectEmit(true, true, true, true, address(pod)); + emit ValidatorBalanceUpdated( + validators[i], + checkpointTimestamp, + newBalanceGwei + ); + } + + if (newBalanceGwei == 0 ) { + cheats.expectEmit(true, true, true, true, address(pod)); + emit ValidatorWithdrawn(checkpointTimestamp, validators[i]); + } + + cheats.expectEmit(true, true, true, true, address(pod)); + emit ValidatorCheckpointed(checkpointTimestamp, validators[i]); + + totalBalanceDeltaGWei += balanceDeltaGwei; + } + int256 totalShareDeltaWei = (int128(uint128(pod.currentCheckpoint().podBalanceGwei)) + totalBalanceDeltaGWei) * int256(1 gwei); + cheats.expectEmit(true, true, true, true, address(pod)); + emit CheckpointFinalized(checkpointTimestamp, totalShareDeltaWei); + } + + /// @dev Calculates the delta between two Gwei amounts and returns as an int256 + function _calcBalanceDelta(uint64 newAmountGwei, uint64 previousAmountGwei) internal pure returns (int128) { + return + int128(uint128(newAmountGwei)) - int128(uint128(previousAmountGwei)); + } + + /******************************************************************************* + verifyStaleBalance + *******************************************************************************/ + + /// @notice randomly roll forward to a stale timestamp. This assumes the beaconTimestamp being + /// passed into verifyStaleBalance is block.timestamp + function rollToStaleTimestamp( + EigenPodUser staker, + bytes32[] memory validatorFields, + uint64 rollSeconds + ) internal { + EigenPod pod = staker.pod(); + + IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(validatorFields.getPubkeyHash()); + uint64 rollForwardTimestamp = uint64(bound( + rollSeconds, + info.lastCheckpointedAt + TIME_TILL_STALE_BALANCE + 1, + info.lastCheckpointedAt + TIME_TILL_STALE_BALANCE + 1 + 2 weeks + )); + cheats.warp(rollForwardTimestamp); + } } -contract EigenPodUnitTests_Initialization is EigenPodUnitTests, IEigenPodEvents { +contract EigenPodUnitTests_Initialization is EigenPodUnitTests { function test_initialization() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + // Check podOwner and restaked - assertEq(eigenPod.podOwner(), podOwner, "Pod owner incorrectly set"); - assertTrue(eigenPod.hasRestaked(), "hasRestaked incorrectly set"); + assertEq(pod.podOwner(), address(staker), "Pod owner incorrectly set"); + assertTrue(pod.hasRestaked(), "hasRestaked incorrectly set"); // Check immutable storage - assertEq(address(eigenPod.ethPOS()), address(ethPOSDepositMock), "EthPOS incorrectly set"); - assertEq(address(eigenPod.eigenPodManager()), address(eigenPodManagerMock), "EigenPodManager incorrectly set"); - assertEq(eigenPod.GENESIS_TIME(), GOERLI_GENESIS_TIME, "Goerli genesis time incorrectly set"); + assertEq(address(pod.ethPOS()), address(ethPOSDepositMock), "EthPOS incorrectly set"); + assertEq(address(pod.eigenPodManager()), address(eigenPodManagerMock), "EigenPodManager incorrectly set"); + assertEq(pod.GENESIS_TIME(), GENESIS_TIME_LOCAL, "LOCAL genesis time incorrectly set"); } function test_initialize_revert_alreadyInitialized() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + cheats.expectRevert("Initializable: contract is already initialized"); - eigenPod.initialize(podOwner); + pod.initialize(address(this)); } function test_initialize_eventEmitted() public { @@ -126,8 +384,12 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests, IEigenPodEvents } } -contract EigenPodUnitTests_Stake is EigenPodUnitTests, IEigenPodEvents { +contract EigenPodUnitTests_EPMFunctions is EigenPodUnitTests { + /******************************************************************************* + stake() tests + *******************************************************************************/ + // Beacon chain staking constnats bytes public constant pubkey = hex"88347ed1c492eedc97fc8c506a35d44d81f27a0c7a1c661b35913cfd15256c0cccbd34a83341f505c7de2983292f2cab"; @@ -167,51 +429,123 @@ contract EigenPodUnitTests_Stake is EigenPodUnitTests, IEigenPodEvents { // Check eth transferred assertEq(address(ethPOSDepositMock).balance, 32 ether, "Incorrect amount transferred"); } -} -contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEvents { - /******************************************************************************* - Withdraw Non Beacon Chain ETH Tests + withdrawRestakedBeaconChainETH() tests *******************************************************************************/ - // function testFuzz_withdrawNonBeaconChainETH_revert_notPodOwner(address invalidCaller) public { - // cheats.assume(invalidCaller != podOwner); - - // cheats.prank(invalidCaller); - // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - // eigenPod.withdrawNonBeaconChainETHBalanceWei(invalidCaller, 1 ether); - // } + function testFuzz_withdrawRestakedBeaconChainETH_revert_notEigenPodManager( + address invalidCaller, + address recipient, + uint256 randAmount + ) public filterFuzzedAddressInputs(invalidCaller) { + // Setup EigenPod Staker + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); - // function test_withdrawNonBeaconChainETH_revert_tooMuchWithdrawn() public { - // // Send EigenPod 0.9 ether - // _seedPodWithETH(0.9 ether); + // ensure invalid caller causing revert + cheats.assume(invalidCaller != address(eigenPodManagerMock)); + cheats.prank(invalidCaller); + cheats.expectRevert("EigenPod.onlyEigenPodManager: not eigenPodManager"); + pod.withdrawRestakedBeaconChainETH(recipient, randAmount); + } - // // Withdraw 1 ether - // cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); - // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 1 ether); - // } + function testFuzz_withdrawRestakedBeaconChainETH_revert_notFullGweiAmount( + address recipient, + uint256 randAmount + ) public { + // Setup EigenPod Staker + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + staker.completeCheckpoint(); + + // ensure amount is not a full gwei + randAmount = (randAmount % 1 gwei) + bound(randAmount, 1, 1 gwei - 1); + cheats.expectRevert("EigenPod.withdrawRestakedBeaconChainETH: amountWei must be a whole Gwei amount"); + cheats.prank(address(eigenPodManagerMock)); + pod.withdrawRestakedBeaconChainETH(recipient, randAmount); + } - // function testFuzz_withdrawNonBeaconChainETH(uint256 ethAmount) public { - // _seedPodWithETH(ethAmount); - // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), ethAmount, "Incorrect amount incremented in receive function"); + function testFuzz_withdrawRestakedBeaconChainETH_revert_withdrawAmountTooLarge( + uint256 rand, + address recipient, + uint256 randAmountWei + ) public { + // Setup EigenPod Staker + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + staker.completeCheckpoint(); + + // ensure amount is too large + uint64 withdrawableRestakedExecutionLayerGwei = pod.withdrawableRestakedExecutionLayerGwei(); + randAmountWei = randAmountWei - (randAmountWei % 1 gwei); + cheats.assume((randAmountWei / 1 gwei) > withdrawableRestakedExecutionLayerGwei); + cheats.expectRevert( + "EigenPod.withdrawRestakedBeaconChainETH: amountGwei exceeds withdrawableRestakedExecutionLayerGwei" + ); + cheats.prank(address(eigenPodManagerMock)); + pod.withdrawRestakedBeaconChainETH(recipient, randAmountWei); + } - // cheats.expectEmit(true, true, true, true); - // emit NonBeaconChainETHWithdrawn(podOwner, ethAmount); - // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, ethAmount); + function testFuzz_withdrawRestakedBeaconChainETH( + uint256 rand, + uint256 randAmountWei + ) public { + // Setup EigenPod Staker + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + staker.completeCheckpoint(); + + // ensure valid fuzzed wei amounts + uint64 withdrawableRestakedExecutionLayerGwei = pod.withdrawableRestakedExecutionLayerGwei(); + randAmountWei = randAmountWei - (randAmountWei % 1 gwei); + cheats.assume((randAmountWei / 1 gwei) <= withdrawableRestakedExecutionLayerGwei); + + address recipient = cheats.addr(uint256(123_456_789)); - // // Checks - // assertEq(address(eigenPod).balance, 0, "Incorrect amount withdrawn from eigenPod"); - // assertEq(address(delayedWithdrawalRouterMock).balance, ethAmount, "Incorrect amount set to delayed withdrawal router"); - // } + cheats.prank(address(eigenPodManagerMock)); + cheats.expectEmit(true, true, true, true, address(pod)); + emit RestakedBeaconChainETHWithdrawn(recipient, randAmountWei); + pod.withdrawRestakedBeaconChainETH(recipient, randAmountWei); + + assertEq(address(recipient).balance, randAmountWei, "recipient should have received withdrawn balance"); + assertEq( + address(pod).balance, + uint(withdrawableRestakedExecutionLayerGwei * 1 gwei) - randAmountWei, + "pod balance should have decreased by withdrawn eth" + ); + assertEq( + pod.withdrawableRestakedExecutionLayerGwei(), + withdrawableRestakedExecutionLayerGwei - uint64(randAmountWei / 1 gwei), + "withdrawableRestakedExecutionLayerGwei should have decreased by amount withdrawn" + ); + } +} +contract EigenPodUnitTests_recoverTokens is EigenPodUnitTests { + /******************************************************************************* - Recover Tokens Tests + recoverTokens() tests *******************************************************************************/ function testFuzz_recoverTokens_revert_notPodOwner(address invalidCaller) public { - cheats.assume(invalidCaller != podOwner); + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + cheats.assume(invalidCaller != podOwner); IERC20[] memory tokens = new IERC20[](1); tokens[0] = IERC20(address(0x123)); uint256[] memory amounts = new uint256[](1); @@ -219,24 +553,53 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven cheats.prank(invalidCaller); cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - eigenPod.recoverTokens(tokens, amounts, podOwner); + pod.recoverTokens(tokens, amounts, podOwner); + } + + function test_recoverTokens_revert_whenPaused() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + + IERC20[] memory tokens = new IERC20[](1); + tokens[0] = IERC20(address(0x123)); + uint256[] memory amounts = new uint256[](1); + amounts[0] = 1; + + // pause recoverTokens + cheats.prank(pauser); + eigenPodManagerMock.pause(1 << PAUSED_NON_PROOF_WITHDRAWALS); + + cheats.prank(podOwner); + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + pod.recoverTokens(tokens, amounts, podOwner); } function test_recoverTokens_revert_invalidLengths() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + IERC20[] memory tokens = new IERC20[](1); tokens[0] = IERC20(address(0x123)); uint256[] memory amounts = new uint256[](2); amounts[0] = 1; amounts[1] = 1; + cheats.startPrank(podOwner); cheats.expectRevert("EigenPod.recoverTokens: tokenList and amountsToWithdraw must be same length"); - eigenPod.recoverTokens(tokens, amounts, podOwner); + pod.recoverTokens(tokens, amounts, podOwner); + cheats.stopPrank(); } function test_recoverTokens() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + // Deploy dummy token IERC20 dummyToken = new ERC20Mock(); - dummyToken.transfer(address(eigenPod), 1e18); + dummyToken.transfer(address(pod), 1e18); // Recover tokens address recipient = address(0x123); @@ -245,119 +608,1088 @@ contract EigenPodUnitTests_PodOwnerFunctions is EigenPodUnitTests, IEigenPodEven uint256[] memory amounts = new uint256[](1); amounts[0] = 1e18; - eigenPod.recoverTokens(tokens, amounts, recipient); + cheats.prank(podOwner); + pod.recoverTokens(tokens, amounts, recipient); // Checks assertEq(dummyToken.balanceOf(recipient), 1e18, "Incorrect amount recovered"); } +} + +contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, ProofParsing { + + /******************************************************************************* + verifyWithdrawalCredentials() tests + *******************************************************************************/ + + /// @notice revert when verify wc is not called by pod owner + function testFuzz_revert_callerIsNotPodOwner(address invalidCaller) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + + (uint40[] memory validators,) = staker.startValidators(); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + cheats.assume(invalidCaller != podOwner); + cheats.prank(invalidCaller); + cheats.expectRevert( + "EigenPod.onlyEigenPodOwner: not podOwner" + ); + + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + } + + /// @notice test verify wc reverts when paused + function test_revert_verifyWithdrawalCredentialsPaused() public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + (uint40[] memory validators,) = staker.startValidators(); + + cheats.prank(pauser); + eigenPodManagerMock.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); + + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + staker.verifyWithdrawalCredentials(validators); + } + + /// @notice beaconTimestamp must be after latest checkpoint + function testFuzz_revert_beaconTimestampInvalid(uint256 rand) public { + cheats.warp(10 days); + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators,) = staker.startValidators(); + + // Start and auto-complete a checkpoint, setting `lastCheckpointTimestamp` to the current block + staker.startCheckpoint(); + + // Try to verify withdrawal credentials at the current block + cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past"); + staker.verifyWithdrawalCredentials(validators); + } + + /// @notice if an eigenPod has not migrated and set hasRestaked to true, verify wc should revert + function testFuzz_revert_restakingNotEnabled(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + _setPodHasNotRestaked(staker); + (uint40[] memory validators,) = staker.startValidators(); + + cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: restaking not active"); + staker.verifyWithdrawalCredentials(validators); + } + + /// @notice Check for revert on input array mismatch lengths + function testFuzz_revert_inputArrayLengthsMismatch(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators,) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + uint40[] memory invalidValidatorIndices = new uint40[](validators.length + 1); + bytes[] memory invalidValidatorFieldsProofs = new bytes[](proofs.validatorFieldsProofs.length + 1); + bytes32[][] memory invalidValidatorFields = new bytes32[][](proofs.validatorFields.length + 1); + + cheats.startPrank(address(staker)); + cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: invalidValidatorIndices, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + + cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: invalidValidatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + + cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: invalidValidatorFields + }); + + cheats.stopPrank(); + } + + /// @notice Check beaconStateRootProof reverts on invalid length or invalid proof + function testFuzz_revert_beaconStateRootProofInvalid(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators,) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + bytes memory proofWithInvalidLength = new bytes(proofs.stateRootProof.proof.length + 1); + BeaconChainProofs.StateRootProof memory invalidStateRootProof = BeaconChainProofs.StateRootProof({ + beaconStateRoot: proofs.stateRootProof.beaconStateRoot, + proof: proofWithInvalidLength + }); + + + cheats.startPrank(address(staker)); + cheats.expectRevert("BeaconChainProofs.verifyStateRoot: Proof has incorrect length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: invalidStateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + + // Change the proof to have an invalid value + bytes1 randValue = bytes1(keccak256(abi.encodePacked(proofs.stateRootProof.proof[0]))); + uint256 proofLength = proofs.stateRootProof.proof.length; + uint256 randIndex = bound(rand, 0, proofLength - 1); + proofs.stateRootProof.proof[randIndex] = randValue; + cheats.expectRevert("BeaconChainProofs.verifyStateRoot: Invalid state root merkle proof"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + cheats.stopPrank(); + } + + /// @notice attempt to verify validator credentials in both ACTIVE and WITHDRAWN states + /// check reverts + function testFuzz_revert_validatorsWithdrawn(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + + // now that validators are ACTIVE, ensure we can't verify them again + cheats.expectRevert( + "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" + ); + staker.verifyWithdrawalCredentials(validators); + + uint64 exitedBalanceGwei = staker.exitValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + staker.completeCheckpoint(); + beaconChain.advanceEpoch_NoRewards(); + + // now that validators are WITHDRAWN, ensure we can't verify them again + cheats.expectRevert( + "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" + ); + staker.verifyWithdrawalCredentials(validators); + } + + /// @notice attempt to verify validator credentials after they have exited + /// check reverts + function testFuzz_revert_validatorsExited(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators,) = staker.startValidators(); + + // Exit validators from beacon chain and withdraw to pod + staker.exitValidators(validators); + beaconChain.advanceEpoch(); + + // now that validators are exited, ensure we can't verify them + cheats.expectRevert( + "EigenPod._verifyWithdrawalCredentials: validator must not be exiting" + ); + staker.verifyWithdrawalCredentials(validators); + } + + /// @notice modify withdrawal credentials to cause a revert + function testFuzz_revert_invalidWithdrawalAddress(uint256 rand, bytes32 invalidWithdrawalCredentials) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators, ) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + // Set invalid withdrawal credentials in validatorFields + uint256 VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX = 1; + proofs.validatorFields[0][VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = invalidWithdrawalCredentials; + + cheats.startPrank(address(staker)); + cheats.expectRevert("EigenPod._verifyWithdrawalCredentials: proof is not for this EigenPod"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + cheats.stopPrank(); + } + + /// @notice modify validator field length to cause a revert + function testFuzz_revert_invalidValidatorFields(uint256 rand, bytes32 randPubkeyIndex) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators, ) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + // change validator field length to invalid value + bytes32[] memory invalidValidatorFields = new bytes32[](BeaconChainProofs.VALIDATOR_FIELDS_LENGTH + 1); + for (uint i = 0; i < BeaconChainProofs.VALIDATOR_FIELDS_LENGTH; i++) { + invalidValidatorFields[i] = proofs.validatorFields[0][i]; + } + proofs.validatorFields[0] = invalidValidatorFields; + + cheats.startPrank(address(staker)); + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Validator fields has incorrect length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + cheats.stopPrank(); + } + + /// @notice modify validator proof length to cause a revert + function testFuzz_revert_invalidValidatorProofLength(uint256 rand, bytes32 randPubkeyIndex) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators, ) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + // add an element to the proof + proofs.validatorFieldsProofs[0] = new bytes(proofs.validatorFieldsProofs[0].length + 32); + + cheats.startPrank(address(staker)); + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Proof has incorrect length"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + cheats.stopPrank(); + } + + /// @notice modify validator pubkey to cause a revert + function testFuzz_revert_invalidValidatorProof(uint256 rand, bytes32 randPubkey) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + (uint40[] memory validators, ) = staker.startValidators(); + EigenPod pod = staker.pod(); + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + // change validator pubkey to an invalid value causing a revert + uint256 VALIDATOR_PUBKEY_INDEX = 0; + proofs.validatorFields[0][VALIDATOR_PUBKEY_INDEX] = randPubkey; + + cheats.startPrank(address(staker)); + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Invalid merkle proof"); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + cheats.stopPrank(); + } + + /// @notice fuzz test a eigenPod with multiple validators. Using timemachine to assert values over time + function testFuzz_verifyWithdrawalCredentials(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators, uint256 beaconBalanceWei) = staker.startValidators(); + // Complete a quick empty checkpoint so we have a nonzero value for `lastCheckpointedAt` + staker.startCheckpoint(); + beaconChain.advanceEpoch_NoRewards(); + + CredentialProofs memory proofs = beaconChain.getCredentialProofs(validators); + + for (uint256 i; i < validators.length; i++) { + cheats.expectEmit(true, true, true, true, address(pod)); + emit ValidatorRestaked(validators[i]); + cheats.expectEmit(true, true, true, true, address(pod)); + emit ValidatorBalanceUpdated( + validators[i], + pod.lastCheckpointTimestamp(), + beaconChain.effectiveBalance(validators[i]) + ); + } + // staker.verifyWithdrawalCredentials(validators); + cheats.prank(address(staker)); + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + 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"); + // Check ValidatorInfo values for each validator + for (uint i = 0; i < validators.length; i++) { + bytes32 pubkeyHash = beaconChain.pubkeyHash(validators[i]); + + IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(pubkeyHash); + assertEq(info.validatorIndex, validators[i], "should have assigned correct validator index"); + assertEq(info.restakedBalanceGwei, beaconChain.effectiveBalance(validators[i]), "should have restaked full effective balance"); + assertEq(info.lastCheckpointedAt, pod.lastCheckpointTimestamp(), "should have recorded correct update time"); + } + } +} + +contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests { /******************************************************************************* - Activate Restaking Tests + startCheckpoint() tests *******************************************************************************/ - // function testFuzz_activateRestaking_revert_notPodOwner(address invalidCaller) public { - // cheats.assume(invalidCaller != podOwner); - - // cheats.prank(invalidCaller); - // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - // eigenPod.activateRestaking(); - // } - - // function test_activateRestaking_revert_alreadyRestaked() public { - // cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); - // eigenPod.activateRestaking(); - // } - - // function testFuzz_activateRestaking(uint256 ethAmount) public hasNotRestaked { - // // Seed some ETH - // _seedPodWithETH(ethAmount); - - // // Activate restaking - // vm.expectEmit(true, true, true, true); - // emit RestakingActivated(podOwner); - // eigenPod.activateRestaking(); - - // // Checks - // assertTrue(eigenPod.hasRestaked(), "hasRestaked incorrectly set"); - // _assertWithdrawalProcessed(ethAmount); - // } - - /** - * This is a regression test for a bug (EIG-14) found by Hexens. Lets say podOwner sends 32 ETH to the EigenPod, - * the nonBeaconChainETHBalanceWei increases by 32 ETH. podOwner calls withdrawBeforeRestaking, which - * will simply send the entire ETH balance (32 ETH) to the owner. The owner activates restaking, - * creates a validator and verifies the withdrawal credentials, receiving 32 ETH in shares. - * They can exit the validator, the pod gets the 32ETH and they can call withdrawNonBeaconChainETHBalanceWei - * And simply withdraw the 32ETH because nonBeaconChainETHBalanceWei is 32ETH. This was an issue because - * nonBeaconChainETHBalanceWei was never zeroed out in _processWithdrawalBeforeRestaking - */ - // function test_regression_validatorBalance_cannotBeRemoved_viaNonBeaconChainETHBalanceWei() external hasNotRestaked { - // // Assert that the pod has not restaked - // assertFalse(eigenPod.hasRestaked(), "hasRestaked should be false"); - - // // Simulate podOwner sending 32 ETH to eigenPod - // _seedPodWithETH(32 ether); - // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 32 ether, "nonBeaconChainETHBalanceWei should be 32 ETH"); - - // // Pod owner calls withdrawBeforeRestaking, sending 32 ETH to owner - // eigenPod.withdrawBeforeRestaking(); - // assertEq(address(eigenPod).balance, 0, "eigenPod balance should be 0"); - // assertEq(address(delayedWithdrawalRouterMock).balance, 32 ether, "withdrawal router balance should be 32 ETH"); - - // // Upgrade from m1 to m2 - - // // Activate restaking on the pod - // eigenPod.activateRestaking(); - - // // Simulate a withdrawal by increasing eth balance without code execution - // cheats.deal(address(eigenPod), 32 ether); - - // // Try calling withdrawNonBeaconChainETHBalanceWei, should fail since `nonBeaconChainETHBalanceWei` - // // was set to 0 when calling `_processWithdrawalBeforeRestaking` from `activateRestaking` - // cheats.expectRevert("EigenPod.withdrawnonBeaconChainETHBalanceWei: amountToWithdraw is greater than nonBeaconChainETHBalanceWei"); - // eigenPod.withdrawNonBeaconChainETHBalanceWei(podOwner, 32 ether); - // } + /// @notice revert when startCheckpoint is not called by pod owner + function testFuzz_revert_callerIsNotPodOwner(uint256 rand, address invalidCaller) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + EigenPod pod = staker.pod(); + address podOwner = pod.podOwner(); + + cheats.assume(invalidCaller != podOwner); + cheats.prank(invalidCaller); + cheats.expectRevert( + "EigenPod.onlyEigenPodOwner: not podOwner" + ); + pod.startCheckpoint({ revertIfNoBalance: false }); + } + + /// @notice test startCheckpoint reverts when paused + function testFuzz_revert_startCheckpointPaused(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + + (uint40[] memory validators,) = staker.startValidators(); + + cheats.prank(pauser); + eigenPodManagerMock.pause(2 ** PAUSED_START_CHECKPOINT); + + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + staker.startCheckpoint(); + } + + /// @notice startCheckpoint should revert if another checkpoint already in progress + function testFuzz_revert_checkpointAlreadyStarted(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + staker.startCheckpoint(); + cheats.expectRevert("EigenPod._startCheckpoint: must finish previous checkpoint before starting another"); + staker.startCheckpoint(); + } + + /// @notice startCheckpoint should revert if a checkpoint has already been completed this block + function testFuzz_revert_checkpointTwicePerBlock(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + staker.startCheckpoint(); + staker.completeCheckpoint(); + + cheats.expectRevert("EigenPod._startCheckpoint: cannot checkpoint twice in one block"); + staker.startCheckpoint(); + } + + /// @notice if no rewards and revertIfNoBalance is set, startCheckpoint should revert + function testFuzz_revert_revertIfNoBalanceIsSet(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + EigenPod pod = staker.pod(); + beaconChain.advanceEpoch_NoRewards(); + + cheats.prank(pod.podOwner()); + cheats.expectRevert("EigenPod._startCheckpoint: no balance available to checkpoint"); + pod.startCheckpoint({ revertIfNoBalance: true }); + } + + /// @notice fuzz test an eigenpod with multiple validators and starting a checkpoint + function testFuzz_startCheckpoint(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + + cheats.expectEmit(true, true, true, true, address(staker.pod())); + emit CheckpointCreated(uint64(block.timestamp), EIP_4788_ORACLE.timestampToBlockRoot(block.timestamp)); + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + assertEq(pod.currentCheckpoint().proofsRemaining, uint24(validators.length), "should have one proof remaining pre verified validator"); + } + + /// @notice fuzz test an eigenpod with multiple validators who hasn't enabled restaking yet + function testFuzz_startCheckpoint_hasRestakedFalse(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + _setPodHasNotRestaked(staker); + + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch(); + + assertFalse( + staker.pod().hasRestaked(), + "hasRestaked should be false" + ); + cheats.expectEmit(true, true, true, true, address(staker.pod())); + emit CheckpointCreated(uint64(block.timestamp), EIP_4788_ORACLE.timestampToBlockRoot(block.timestamp)); + cheats.expectEmit(true, true, true, true, address(staker.pod())); + emit RestakingActivated(address(staker)); + staker.startCheckpoint(); + assertTrue( + staker.pod().hasRestaked(), + "hasRestaked should be true" + ); + } +} + +contract EigenPodUnitTests_verifyCheckpointProofs is EigenPodUnitTests { /******************************************************************************* - Withdraw Before Restaking Tests + verifyCheckpointProofs() tests *******************************************************************************/ - // function testFuzz_withdrawBeforeRestaking_revert_notPodOwner(address invalidCaller) public filterFuzzedAddressInputs(invalidCaller) { - // cheats.assume(invalidCaller != podOwner); + /// @notice test verifyCheckpointProofs reverts when paused + function testFuzz_revert_verifyCheckpointProofsPaused(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); - // cheats.prank(invalidCaller); - // cheats.expectRevert("EigenPod.onlyEigenPodOwner: not podOwner"); - // eigenPod.withdrawBeforeRestaking(); - // } + cheats.prank(pauser); + eigenPodManagerMock.pause(2 ** PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS); + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } - // function test_withdrawBeforeRestaking_revert_alreadyRestaked() public { - // cheats.expectRevert("EigenPod.hasNeverRestaked: restaking is enabled"); - // eigenPod.withdrawBeforeRestaking(); - // } + /// @notice verifyCheckpointProofs should revert if checkpoint not in progress + function testFuzz_revert_checkpointNotStarted(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); - // function testFuzz_withdrawBeforeRestaking(uint256 ethAmount) public hasNotRestaked { - // // Seed some ETH - // _seedPodWithETH(ethAmount); + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + cheats.expectRevert( + "EigenPod.verifyCheckpointProofs: must have active checkpoint to perform checkpoint proof" + ); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } - // // Withdraw - // eigenPod.withdrawBeforeRestaking(); + /// @notice invalid proof length should revert + function testFuzz_revert_verifyBalanceContainerInvalidLengths(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); - // // Checks - // _assertWithdrawalProcessed(ethAmount); - // } + // change the length of balanceContainerProof to cause a revert + proofs.balanceContainerProof.proof = new bytes(proofs.balanceContainerProof.proof.length + 1); - // Helpers - // function _assertWithdrawalProcessed(uint256 amount) internal { - // assertEq(eigenPod.mostRecentWithdrawalTimestamp(), uint32(block.timestamp), "Incorrect mostRecentWithdrawalTimestamp"); - // assertEq(eigenPod.nonBeaconChainETHBalanceWei(), 0, "Incorrect nonBeaconChainETHBalanceWei"); - // assertEq(address(delayedWithdrawalRouterMock).balance, amount, "Incorrect amount sent to delayed withdrawal router"); - // } + cheats.expectRevert("BeaconChainProofs.verifyBalanceContainer: Proof has incorrect length"); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } - function _seedPodWithETH(uint256 ethAmount) internal { - cheats.deal(address(this), ethAmount); - bool result; - bytes memory data; - (result, data) = address(eigenPod).call{value: ethAmount}(""); + /// @notice change one of the bytes in the balanceContainer proof to cause a revert + function testFuzz_revert_verifyBalanceContainerInvalidProof(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + // randomly change one of the bytes in the proof to make the proof invalid + bytes1 randValue = bytes1(keccak256(abi.encodePacked(proofs.balanceContainerProof.proof[0]))); + proofs.balanceContainerProof.proof[0] = randValue; + + cheats.expectRevert("BeaconChainProofs.verifyBalanceContainer: invalid balance container proof"); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } + + /// @notice invalid balance proof length should revert + function testFuzz_revert_verifyValidatorBalanceInvalidLength(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + + // change the length of balance proof to cause a revert + proofs.balanceProofs[0].proof = new bytes(proofs.balanceProofs[0].proof.length + 1); + + cheats.expectRevert("BeaconChainProofs.verifyValidatorBalance: Proof has incorrect length"); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } + + /// @notice change one of the bytes in one of the balance proofs to cause a revert + function testFuzz_revert_verifyValidatorBalanceInvalidProof(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + beaconChain.advanceEpoch(); + staker.startCheckpoint(); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + // randomly change one of the bytes in the first proof to make the proof invalid + bytes1 randValue = bytes1(keccak256(abi.encodePacked(proofs.balanceProofs[0].proof[0]))); + proofs.balanceProofs[0].proof[0] = randValue; + + cheats.expectRevert("BeaconChainProofs.verifyValidatorBalance: Invalid merkle proof"); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } + + /// @notice test that verifyCheckpointProofs skips proofs submitted for non-ACTIVE validators + function testFuzz_verifyCheckpointProofs_skipIfNotActive(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + // Ensure we have more than one validator (_newEigenPodStaker allocates a nonzero amt of eth) + cheats.deal(address(staker), address(staker).balance + 32 ether); + EigenPod pod = staker.pod(); + + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + + // Exit a validator and advance epoch so the exit is picked up next checkpoint + uint40[] memory exitedValidator = new uint40[](1); + exitedValidator[0] = validators[0]; + uint64 exitedBalanceGwei = staker.exitValidators(exitedValidator); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + exitedValidator, + pod.currentCheckpointTimestamp() + ); + + // verify checkpoint proof for one exited validator + // manually create a snapshot here for Snap checks + timeMachine.createSnapshot(); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + assertEq(0, pod.withdrawableRestakedExecutionLayerGwei(), "should not have updated withdrawable balance"); + assertEq(pod.currentCheckpoint().proofsRemaining, validators.length - 1, "should have decreased proofs remaining by 1"); + assert_Snap_Removed_ActiveValidatorCount(staker, 1, "should have removed one validator from active set"); + assert_Snap_Removed_ActiveValidators(staker, exitedValidator, "should have set validator status to WITHDRAWN"); + + // attempt to submit the same proof and ensure that checkpoint did not progress + // the call should succeed, but nothing should happen + // manually create a snapshot here for Snap checks + timeMachine.createSnapshot(); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + + assertEq(0, pod.withdrawableRestakedExecutionLayerGwei(), "should not have updated withdrawable balance"); + assertEq(pod.currentCheckpoint().proofsRemaining, validators.length - 1, "should not have decreased proofs remaining"); + assert_Snap_Unchanged_ActiveValidatorCount(staker, "should have the same active validator count"); + + // finally, finish the checkpoint by submitting all proofs + proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + // manually create a snapshot here for Snap checks + timeMachine.createSnapshot(); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + + assert_Snap_Unchanged_ActiveValidatorCount(staker, "should have the same active validator count after completing checkpoint"); + assertEq(exitedBalanceGwei, pod.withdrawableRestakedExecutionLayerGwei(), "exited balance should now be withdrawable"); + assertEq( + pod.currentCheckpointTimestamp(), + 0, + "checkpoint should be complete" + ); + } + + /// @notice test that verifyCheckpointProofs skips duplicate checkpoint proofs + function testFuzz_verifyCheckpointProofs_skipIfAlreadyProven(uint256 rand, bool epochRewards) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + // Ensure we have more than one validator (_newEigenPodStaker allocates a nonzero amt of eth) + cheats.deal(address(staker), address(staker).balance + 32 ether); + EigenPod pod = staker.pod(); + + (uint40[] memory validators,) = staker.startValidators(); + beaconChain.advanceEpoch_NoWithdraw(); // generate rewards on the beacon chain + staker.verifyWithdrawalCredentials(validators); + + // select a single validator to submit multiple times + uint40[] memory singleValidator = new uint40[](1); + singleValidator[0] = validators[0]; + + staker.startCheckpoint(); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + singleValidator, + pod.currentCheckpointTimestamp() + ); + + // verify checkpoint proof for one validator + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + assertEq(pod.currentCheckpoint().proofsRemaining, validators.length - 1, "should have decreased proofs remaining by 1"); + + // attempt to submit the same proof and ensure that checkpoint did not progress + // the call should succeed, but nothing should happen + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + assertEq(pod.currentCheckpoint().proofsRemaining, validators.length - 1, "should not have decreased proofs remaining"); + + // finally, finish the checkpoint by submitting all proofs + proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + + assertEq( + pod.currentCheckpointTimestamp(), + 0, + "checkpoint should be complete" + ); + // Check ValidatorInfo values for each validator + for (uint i = 0; i < validators.length; i++) { + bytes32 pubkeyHash = beaconChain.pubkeyHash(validators[i]); + + IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(pubkeyHash); + assertEq(info.restakedBalanceGwei, beaconChain.currentBalance(validators[i]), "should have restaked full current balance"); + assertEq(info.lastCheckpointedAt, pod.lastCheckpointTimestamp(), "should have recorded correct update time"); + } + } + + /// @notice test that verifyCheckpointProofs sets validators to WITHDRAWN if they are exited + function testFuzz_verifyCheckpointProofs_validatorExits(uint256 rand) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + + // Exit validators and advance epoch so exits are picked up in next checkpoint + uint64 exitedBalanceGwei = staker.exitValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + + // Verify checkpoint proofs emit the expected values + _expectEventsVerifyCheckpointProofs(staker, validators, proofs.balanceProofs); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + assertEq( + pod.currentCheckpointTimestamp(), + 0, + "checkpoint should be complete" + ); + + assertEq(pod.withdrawableRestakedExecutionLayerGwei(), exitedBalanceGwei, "exited balance should be withdrawable"); + + // Check ValidatorInfo values for each validator + for (uint i = 0; i < validators.length; i++) { + bytes32 pubkeyHash = beaconChain.pubkeyHash(validators[i]); + + IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(pubkeyHash); + assertEq(info.restakedBalanceGwei, 0, "should have 0 restaked balance"); + assertEq(info.lastCheckpointedAt, pod.lastCheckpointTimestamp(), "should have recorded correct update time"); + assertTrue(info.status == IEigenPod.VALIDATOR_STATUS.WITHDRAWN, "should have recorded correct update time"); + } + } + + /// @notice fuzz test an eigenPod with multiple validators and verifyCheckpointProofs + function testFuzz_verifyCheckpointProofs(uint256 rand, bool epochRewards) public { + // Setup verifyCheckpointProofs + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + staker.verifyWithdrawalCredentials(validators); + if (epochRewards) { + beaconChain.advanceEpoch(); + } else { + beaconChain.advanceEpoch_NoRewards(); + } + staker.startCheckpoint(); + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs( + validators, + pod.currentCheckpointTimestamp() + ); + + // Verify checkpoint proofs emit the expected values + _expectEventsVerifyCheckpointProofs(staker, validators, proofs.balanceProofs); + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + assertEq( + pod.currentCheckpointTimestamp(), + 0, + "checkpoint should be complete" + ); + } +} + +/// @notice TODO +contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { + /// @notice test verifyStaleBalance reverts when paused + function testFuzz_revert_verifyStaleBalancePaused(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validators[0]); + + cheats.prank(pauser); + eigenPodManagerMock.pause(2 ** PAUSED_VERIFY_STALE_BALANCE); + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice test verifyStaleBalance reverts when paused via the PAUSED_START_CHECKPOINT flag + function testFuzz_revert_verifyStaleBalancePausedViaStartCheckpoint(uint256 rand) public { + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validators[0]); + + cheats.prank(pauser); + eigenPodManagerMock.pause(2 ** PAUSED_START_CHECKPOINT); + cheats.expectRevert("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert if validator balance too stale + function testFuzz_revert_validatorBalanceNotStale(uint256 rand) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + beaconChain.advanceEpoch(); + staker.verifyWithdrawalCredentials(validators); + + // proof for given beaconTimestamp is not yet stale, this should revert + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + cheats.expectRevert("EigenPod.verifyStaleBalance: validator balance is not stale yet"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert if validator status is not ACTIVE + function testFuzz_revert_validatorStatusNotActive(uint256 rand, uint64 randRollSeconds) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + + // Advance epoch and use stale balance proof without verifyingWithdrawalCredentials + // validator should be INACTIVE and cause a revert + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + cheats.expectRevert("EigenPod.verifyStaleBalance: validator is not active"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert if validator is not slashed + function testFuzz_revert_validatorNotSlashed(uint256 rand, uint64 randRollSeconds) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch and use stale balance proof where the validator has not been slashed + // this should cause a revert + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + cheats.expectRevert("EigenPod.verifyStaleBalance: validator must be slashed to be marked stale"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof length + function testFuzz_revert_beaconStateRootProofInvalidLength(uint256 rand, uint64 randRollSeconds) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.slashValidators(validators); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + // change the proof to have an invalid length + bytes memory proofWithInvalidLength = new bytes(proofs.stateRootProof.proof.length + 1); + BeaconChainProofs.StateRootProof memory invalidStateRootProof = BeaconChainProofs.StateRootProof({ + beaconStateRoot: proofs.stateRootProof.beaconStateRoot, + proof: proofWithInvalidLength + }); + + cheats.expectRevert("BeaconChainProofs.verifyStateRoot: Proof has incorrect length"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: invalidStateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof + function testFuzz_revert_beaconStateRootProofInvalid(uint256 rand, uint64 randRollSeconds) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.slashValidators(validators); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + // change the proof to have an invalid value + bytes1 randValue = bytes1(keccak256(abi.encodePacked(proofs.stateRootProof.proof[0]))); + uint256 proofLength = proofs.stateRootProof.proof.length; + uint256 randIndex = bound(rand, 0, proofLength - 1); + proofs.stateRootProof.proof[randIndex] = randValue; + + cheats.expectRevert("BeaconChainProofs.verifyStateRoot: Invalid state root merkle proof"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert with invalid validatorFields and validator proof length + function testFuzz_revert_validatorContainerProofInvalidLength( + uint256 rand, + uint64 randRollSeconds + ) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.slashValidators(validators); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + // change the proof to have an invalid length + uint256 proofLength = proofs.validatorProof.proof.length; + bytes memory invalidProof = new bytes(proofLength + 1); + BeaconChainProofs.ValidatorProof memory invalidValidatorProof = BeaconChainProofs.ValidatorProof({ + validatorFields: proofs.validatorProof.validatorFields, + proof: invalidProof + }); + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Proof has incorrect length"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: invalidValidatorProof + }); + + // Change the validator fields to have an invalid length + bytes32[] memory validatorFieldsInvalidLength = new bytes32[](proofs.validatorProof.validatorFields.length + 1); + for (uint256 i = 0; i < proofs.validatorProof.validatorFields.length; i++) { + validatorFieldsInvalidLength[i] = proofs.validatorProof.validatorFields[i]; + } + proofs.validatorProof.validatorFields = validatorFieldsInvalidLength; + + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Validator fields has incorrect length"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice verifyStaleBalance should revert with invalid validatorContainer proof + function testFuzz_revert_validatorContainerProofInvalid( + uint256 rand, + uint64 randRollSeconds, + bytes32 randWithdrawalCredentials + ) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.slashValidators(validators); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + // change validator withdrawal creds to an invalid value causing a revert + uint256 VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX = 1; + proofs.validatorProof.validatorFields[VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX] = randWithdrawalCredentials; + + cheats.expectRevert("BeaconChainProofs.verifyValidatorFields: Invalid merkle proof"); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + function testFuzz_verifyStaleBalance( + uint256 rand, + uint64 randRollSeconds + ) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + staker.verifyWithdrawalCredentials(validators); + + // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward + beaconChain.advanceEpoch(); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + beaconChain.slashValidators(validators); + beaconChain.advanceEpoch(); + proofs = beaconChain.getStaleBalanceProofs(validator); + + cheats.expectEmit(true, true, true, true, address(staker.pod())); + emit CheckpointCreated(uint64(block.timestamp), EIP_4788_ORACLE.timestampToBlockRoot(block.timestamp)); + pod.verifyStaleBalance({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + check_StartCheckpoint_State(staker); } } @@ -373,7 +1705,7 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { eigenPodHarnessImplementation = new EigenPodHarness( ethPOSDepositMock, eigenPodManagerMock, - GOERLI_GENESIS_TIME + GENESIS_TIME_LOCAL ); // Upgrade eigenPod to harness @@ -382,7 +1714,9 @@ contract EigenPodHarnessSetup is EigenPodUnitTests { } } -contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSetup, ProofParsing, IEigenPodEvents { +/// @notice No unit tests as of now but would be good to add specific unit tests using proofs from our proofGen library +/// for a EigenPod on Holesky +contract EigenPodUnitTests_proofParsingTests is EigenPodHarnessSetup, ProofParsing { using BytesLib for bytes; using BeaconChainProofs for *; @@ -393,111 +1727,6 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe bytes validatorFieldsProof; bytes32[] validatorFields; - function test_revert_validatorActive() public { - // Set JSON & params - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _setWithdrawalCredentialParams(); - - // Set validator status to active - eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.ACTIVE); - - // Expect revert - cheats.expectRevert( - "EigenPod.verifyCorrectWithdrawalCredentials: Validator must be inactive to prove withdrawal credentials" - ); - eigenPodHarness.verifyWithdrawalCredentials( - oracleTimestamp, - beaconStateRoot, - validatorIndex, - validatorFieldsProof, - validatorFields - ); - } - - function testFuzz_revert_invalidValidatorFields(address wrongWithdrawalAddress) public { - cheats.assume(wrongWithdrawalAddress != address(eigenPodHarness)); - // Set JSON and params - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _setWithdrawalCredentialParams(); - - // Change the withdrawal credentials in validatorFields, which is at index 1 - validatorFields[1] = abi.encodePacked(bytes1(uint8(1)), bytes11(0), wrongWithdrawalAddress).toBytes32(0); - - // Expect revert - cheats.expectRevert( - "EigenPod.verifyCorrectWithdrawalCredentials: Proof is not for this EigenPod" - ); - eigenPodHarness.verifyWithdrawalCredentials( - oracleTimestamp, - beaconStateRoot, - validatorIndex, - validatorFieldsProof, - validatorFields - ); - } - - // function test_effectiveBalanceGreaterThan32ETH() public { - // // Set JSON and params - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _setWithdrawalCredentialParams(); - - // // Check that restaked balance greater than 32 ETH - // uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); - // assertGt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance less than 32 ETH"); - - // uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); - - // // Verify withdrawal credentials - // vm.expectEmit(true, true, true, true); - // emit ValidatorRestaked(validatorIndex); - // vm.expectEmit(true, true, true, true); - // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - // uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( - // oracleTimestamp, - // beaconStateRoot, - // validatorIndex, - // validatorFieldsProof, - // validatorFields - // ); - - // // Checks - // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - // assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); - // assertEq(restakedBalanceWei, uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * uint256(1e9), "Returned restaked balance gwei should be max"); - // _assertWithdrawalCredentialsSet(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - // } - - // function test_effectiveBalanceLessThan32ETH() public { - // // Set JSON and params - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - // _setWithdrawalCredentialParams(); - - // // Check that restaked balance less than 32 ETH - // uint64 effectiveBalanceGwei = validatorFields.getEffectiveBalanceGwei(); - // assertLt(effectiveBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Proof file has an effective balance greater than 32 ETH"); - - // uint activeValidatorCountBefore = eigenPodHarness.getActiveValidatorCount(); - - // // Verify withdrawal credentials - // vm.expectEmit(true, true, true, true); - // emit ValidatorRestaked(validatorIndex); - // vm.expectEmit(true, true, true, true); - // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, effectiveBalanceGwei); - // uint256 restakedBalanceWei = eigenPodHarness.verifyWithdrawalCredentials( - // oracleTimestamp, - // beaconStateRoot, - // validatorIndex, - // validatorFieldsProof, - // validatorFields - // ); - - // // Checks - // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - // assertEq(activeValidatorCountAfter, activeValidatorCountBefore + 1, "active validator count should increase when proving withdrawal credentials"); - // assertEq(restakedBalanceWei, uint256(effectiveBalanceGwei) * uint256(1e9), "Returned restaked balance gwei incorrect"); - // _assertWithdrawalCredentialsSet(effectiveBalanceGwei); - // } - function _assertWithdrawalCredentialsSet(uint256 restakedBalanceGwei) internal { IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.ACTIVE), "Validator status should be active"); @@ -506,7 +1735,6 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe assertEq(validatorInfo.restakedBalanceGwei, restakedBalanceGwei, "Restaked balance gwei not set correctly"); } - function _setWithdrawalCredentialParams() public { // Set beacon state root, validatorIndex beaconStateRoot = getBeaconStateRoot(); @@ -515,550 +1743,9 @@ contract EigenPodUnitTests_VerifyWithdrawalCredentialsTests is EigenPodHarnessSe validatorFields = getValidatorFields(); // Get an oracle timestamp - cheats.warp(GOERLI_GENESIS_TIME + 1 days); + cheats.warp(GENESIS_TIME_LOCAL + 1 days); oracleTimestamp = uint64(block.timestamp); } -} - -/// @notice In practice, this function should be called after a validator has verified their withdrawal credentials -contract EigenPodUnitTests_VerifyBalanceUpdateTests is EigenPodHarnessSetup, ProofParsing, IEigenPodEvents { - using BeaconChainProofs for *; - - // Params to verifyBalanceUpdate, can be set in test or helper function - uint64 oracleTimestamp; - uint40 validatorIndex; - bytes32 beaconStateRoot; - bytes validatorFieldsProof; - bytes32[] validatorFields; - - // function testFuzz_revert_oracleTimestampStale(uint64 oracleFuzzTimestamp, uint64 lastCheckpointedAt) public { - // // Constain inputs and set proof file - // cheats.assume(oracleFuzzTimestamp < lastCheckpointedAt); - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // // Get validator fields and balance update root - // validatorFields = getValidatorFields(); - // validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); - - // // Balance update reversion - // cheats.expectRevert( - // "EigenPod.verifyBalanceUpdate: Validators balance has already been updated for this timestamp" - // ); - // eigenPodHarness.verifyBalanceUpdate( - // oracleFuzzTimestamp, - // 0, - // bytes32(0), - // validatorFieldsProof, - // validatorFields, - // lastCheckpointedAt - // ); - // } - - // function test_revert_validatorInactive() public { - // // Set proof file - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // // Set proof params - // _setBalanceUpdateParams(); - - // // Set validator status to inactive - // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); - - // // Balance update reversion - // cheats.expectRevert( - // "EigenPod.verifyBalanceUpdate: Validator not active" - // ); - // eigenPodHarness.verifyBalanceUpdate( - // oracleTimestamp, - // validatorIndex, - // beaconStateRoot, - // validatorFieldsProof, - // validatorFields, - // 0 // Most recent balance update timestamp set to 0 - // ); - // } - - /** - * Regression test for a bug that allowed balance updates to be made for withdrawn validators. Thus - * the validator's balance could be maliciously proven to be 0 before the validator themselves are - * able to prove their withdrawal. - */ - // function test_revert_balanceUpdateAfterWithdrawableEpoch() external { - // // Set Json proof - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // // Set proof params - // _setBalanceUpdateParams(); - - // // Set effective balance and withdrawable epoch - // validatorFields[2] = bytes32(uint256(0)); // per consensus spec, slot 2 is effective balance - // validatorFields[7] = bytes32(uint256(0)); // per consensus spec, slot 7 is withdrawable epoch == 0 - - // console.log("withdrawable epoch: ", validatorFields.getWithdrawableEpoch()); - // // Expect revert on balance update - // cheats.expectRevert(bytes("EigenPod.verifyBalanceUpdate: validator is withdrawable but has not withdrawn")); - // eigenPodHarness.verifyBalanceUpdate(oracleTimestamp, validatorIndex, beaconStateRoot, validatorFieldsProof, validatorFields, 0); - // } - - /// @notice Rest of tests assume beacon chain proofs are correct; Now we update the validator's balance - - ///@notice Balance of validator is >= 32e9 - // function test_positiveSharesDelta() public { - // // Set JSON - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // // Set proof params - // _setBalanceUpdateParams(); - - // // Verify balance update - // vm.expectEmit(true, true, true, true); - // emit ValidatorBalanceUpdated(validatorIndex, oracleTimestamp, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - // oracleTimestamp, - // validatorIndex, - // beaconStateRoot, - // validatorFieldsProof, - // validatorFields, - // 0 // Most recent balance update timestamp set to 0 - // ); - - // // Checks - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - // assertGt(sharesDeltaGwei, 0, "Shares delta should be positive"); - // assertEq(sharesDeltaGwei, int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)), "Shares delta should be equal to restaked balance"); - // } - - // function test_negativeSharesDelta() public { - // // Set JSON - // setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); - - // // Set proof params - // _setBalanceUpdateParams(); - // uint64 newValidatorBalance = validatorFields.getEffectiveBalanceGwei(); - - // // Set balance of validator to max ETH - // eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - - // // Verify balance update - // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - // oracleTimestamp, - // validatorIndex, - // beaconStateRoot, - // validatorFieldsProof, - // validatorFields, - // 0 // Most recent balance update timestamp set to 0 - // ); - - // // Checks - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - // assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei should be max"); - // assertLt(sharesDeltaGwei, 0, "Shares delta should be negative"); - // int256 expectedSharesDiff = int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - // assertEq(sharesDeltaGwei, expectedSharesDiff, "Shares delta should be equal to restaked balance"); - // } - - // function test_zeroSharesDelta() public { - // // Set JSON - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - - // // Set proof params - // _setBalanceUpdateParams(); - - // // Set previous restaked balance to max restaked balance - // eigenPodHarness.setValidatorRestakedBalance(validatorFields[0], MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR); - - // // Verify balance update - // int256 sharesDeltaGwei = eigenPodHarness.verifyBalanceUpdate( - // oracleTimestamp, - // validatorIndex, - // beaconStateRoot, - // validatorFieldsProof, - // validatorFields, - // 0 // Most recent balance update timestamp set to 0 - // ); - - // // Checks - // assertEq(sharesDeltaGwei, 0, "Shares delta should be 0"); - // } - - // function _setBalanceUpdateParams() internal { - // // Set validator index, beacon state root, balance update proof, and validator fields - // validatorIndex = uint40(getValidatorIndex()); - // beaconStateRoot = getBeaconStateRoot(); - // validatorFieldsProof = abi.encodePacked(getBalanceUpdateProof()); - // validatorFields = getValidatorFields(); - - // // Get an oracle timestamp - // cheats.warp(GOERLI_GENESIS_TIME + 1 days); - // oracleTimestamp = uint64(block.timestamp); - - // // Set validator status to active - // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.ACTIVE); - // } -} - -contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing, IEigenPodEvents { - using BeaconChainProofs for *; - - // Params to process withdrawal - bytes32 beaconStateRoot; - // BeaconChainProofs.WithdrawalProof withdrawalToProve; - bytes validatorFieldsProof; - bytes32[] validatorFields; - bytes32[] withdrawalFields; - - // Most recent withdrawal timestamp incremented when withdrawal processed before restaking OR when staking activated - // function test_verifyAndProcessWithdrawal_revert_staleProof() public hasNotRestaked { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Set timestamp to after withdrawal timestamp - // uint64 timestampOfWithdrawal = Endian.fromLittleEndianUint64(withdrawalToProve.timestampRoot); - // uint256 newTimestamp = timestampOfWithdrawal + 2500; - // cheats.warp(newTimestamp); - - // // Activate restaking, setting `mostRecentWithdrawalTimestamp` - // eigenPodHarness.activateRestaking(); - - // // Expect revert - // cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - // } - - // function test_verifyAndProcessWithdrawal_revert_statusInactive() public { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Set status to inactive - // eigenPodHarness.setValidatorStatus(validatorFields[0], IEigenPod.VALIDATOR_STATUS.INACTIVE); - - // // Expect revert - // cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: Validator never proven to have withdrawal credentials pointed to this contract"); - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - // } - - // function test_verifyAndProcessWithdrawal_withdrawalAlreadyProcessed() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Process withdrawal - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Attempt to process again - // cheats.expectRevert("EigenPod._verifyAndProcessWithdrawal: withdrawal has already been proven for this timestamp"); - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - // } - - // function test_verifyAndProcessWithdrawal_excess() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Process withdrawal - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Verify storage - // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - // } - - // regression test for off-by-one error - // function test_verifyAndProcessWithdrawal_atLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // // set the `mostRecentWithdrawalTimestamp` to be equal to the withdrawal timestamp - // eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp); - - // // Process withdrawal - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Verify storage - // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - // } - - // function test_revert_verifyAndProcessWithdrawal_beforeLatestWithdrawalTimestamp() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // // set the `mostRecentWithdrawalTimestamp` to just after the withdrawal timestamp - // eigenPodHarness.setMostRecentWithdrawalTimestamp(withdrawalTimestamp + 1); - - // // Process withdrawal, expect revert - // cheats.expectRevert("EigenPod.proofIsForValidTimestamp: beacon chain proof must be at or after mostRecentWithdrawalTimestamp"); - // eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - // } - - /// @notice Tests processing a full withdrawal > MAX_RESTAKED_GWEI_PER_VALIDATOR - // function test_processFullWithdrawal_excess32ETH() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Get params to check against - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // uint40 validatorIndex = uint40(getValidatorIndex()); - // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - // assertGt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); - - // // Process full withdrawal - // vm.expectEmit(true, true, true, true); - // emit FullWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); - // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Storage checks in _verifyAndProcessWithdrawal - // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // // Checks from _processFullWithdrawal - // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Incorrect withdrawable restaked execution layer gwei"); - // // Excess withdrawal amount is diff between restaked balance and total withdrawal amount - // uint64 excessWithdrawalAmount = withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - // assertEq(vw.amountToSendGwei, excessWithdrawalAmount, "Amount to send via router is not correct"); - // assertEq(vw.sharesDeltaGwei, 0, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max - - // // ValidatorInfo storage update checks - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - // } - - // function test_processFullWithdrawal_lessThan32ETH() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); - // _setWithdrawalProofParams(); - - // // Get params to check against - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - // assertLt(withdrawalAmountGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Withdrawal amount should be greater than max restaked balance for this test"); - - // // Process full withdrawal - // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Storage checks in _verifyAndProcessWithdrawal - // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // // Checks from _processFullWithdrawal - // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmountGwei, "Incorrect withdrawable restaked execution layer gwei"); - // // Excess withdrawal amount should be 0 since balance is < MAX - // assertEq(vw.amountToSendGwei, 0, "Amount to send via router is not correct"); - // int256 expectedSharesDiff = int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - // assertEq(vw.sharesDeltaGwei, expectedSharesDiff, "Shares delta not correct"); // Shares delta is 0 since restaked balance and amount to withdraw were max - - // // ValidatorInfo storage update checks - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - // } - - // function test_processPartialWithdrawal() public setWithdrawalCredentialsExcess { - // // Set JSON & params - // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - // _setWithdrawalProofParams(); - - // // Get params to check against - // uint64 withdrawalTimestamp = withdrawalToProve.getWithdrawalTimestamp(); - // uint40 validatorIndex = uint40(getValidatorIndex()); - // uint64 withdrawalAmountGwei = withdrawalFields.getWithdrawalAmountGwei(); - - // // Assert that partial withdrawal code path will be tested - // assertLt(withdrawalToProve.getWithdrawalEpoch(), validatorFields.getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); - - // // Process partial withdrawal - // vm.expectEmit(true, true, true, true); - // emit PartialWithdrawalRedeemed(validatorIndex, withdrawalTimestamp, podOwner, withdrawalAmountGwei); - // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.verifyAndProcessWithdrawal( - // beaconStateRoot, - // withdrawalToProve, - // validatorFieldsProof, - // validatorFields, - // withdrawalFields - // ); - - // // Storage checks in _verifyAndProcessWithdrawal - // bytes32 validatorPubKeyHash = validatorFields.getPubkeyHash(); - // assertTrue(eigenPodHarness.provenWithdrawal(validatorPubKeyHash, withdrawalTimestamp), "Withdrawal not set to proven"); - - // // Checks from _processPartialWithdrawal - // assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), withdrawalAmountGwei, "Incorrect partial withdrawal amount"); - // assertEq(vw.amountToSendGwei, withdrawalAmountGwei, "Amount to send via router is not correct"); - // assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); - - // // Assert validator still has same restaked balance and status - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPodHarness.validatorPubkeyHashToInfo(validatorFields[0]); - // assertEq(uint8(validatorInfo.status), uint8(IEigenPod.VALIDATOR_STATUS.ACTIVE), "Validator status should be active"); - // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - // } - - // function testFuzz_processFullWithdrawal(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { - // // Format validatorInfo struct - // IEigenPod.ValidatorInfo memory validatorInfo = IEigenPod.ValidatorInfo({ - // validatorIndex: 0, - // restakedBalanceGwei: restakedAmount, - // lastCheckpointedAt: 0, - // status: IEigenPod.VALIDATOR_STATUS.ACTIVE - // }); - - // // Since we're withdrawing using an ACTIVE validator, ensure we have - // // a validator count to decrement - // uint activeValidatorCountBefore = 1 + eigenPodHarness.getActiveValidatorCount(); - // eigenPodHarness.setActiveValidatorCount(activeValidatorCountBefore); - - // // Process full withdrawal. - // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processFullWithdrawal(0, pubkeyHash, 0, podOwner, withdrawalAmount, validatorInfo); - - // // Validate that our activeValidatorCount decreased - // uint activeValidatorCountAfter = eigenPodHarness.getActiveValidatorCount(); - // assertEq(activeValidatorCountAfter, activeValidatorCountBefore - 1, "active validator count should decrease when withdrawing active validator"); - - // // Get expected amounts based on withdrawalAmount - // uint64 amountETHToQueue; - // uint64 amountETHToSend; - // if (withdrawalAmount > MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR){ - // amountETHToQueue = MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - // amountETHToSend = withdrawalAmount - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; - // } else { - // amountETHToQueue = withdrawalAmount; - // amountETHToSend = 0; - // } - - // // Check invariant-> amountToQueue + amountToSend = withdrawalAmount - // assertEq(vw.amountToSendGwei + eigenPod.withdrawableRestakedExecutionLayerGwei(), withdrawalAmount, "Amount to queue and send must add up to total withdrawal amount"); - - // // Check amount to queue and send - // assertEq(vw.amountToSendGwei, amountETHToSend, "Amount to queue is not correct"); - // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), amountETHToQueue, "Incorrect withdrawable restaked execution layer gwei"); - - // // Check shares delta - // int256 expectedSharesDelta = int256(uint256(amountETHToQueue)) - int256(uint256(restakedAmount)); - // assertEq(vw.sharesDeltaGwei, expectedSharesDelta, "Shares delta not correct"); - - // // Storage checks - // IEigenPod.ValidatorInfo memory validatorInfoAfter = eigenPodHarness.validatorPubkeyHashToInfo(pubkeyHash); - // assertEq(uint8(validatorInfoAfter.status), uint8(IEigenPod.VALIDATOR_STATUS.WITHDRAWN), "Validator status should be withdrawn"); - // assertEq(validatorInfoAfter.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - // } - - // function testFuzz_processFullWithdrawal_lessMaxRestakedBalance(bytes32 pubkeyHash, uint64 restakedAmount, uint64 withdrawalAmount) public { - // withdrawalAmount = uint64(bound(withdrawalAmount, 0, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR)); - // testFuzz_processFullWithdrawal(pubkeyHash, restakedAmount, withdrawalAmount); - // } - - // function testFuzz_processPartialWithdrawal( - // uint40 validatorIndex, - // uint64 withdrawalTimestamp, - // address recipient, - // uint64 partialWithdrawalAmountGwei - // ) public { - // IEigenPod.VerifiedWithdrawal memory vw = eigenPodHarness.processPartialWithdrawal(validatorIndex, withdrawalTimestamp, recipient, partialWithdrawalAmountGwei); - - // // Checks - // assertEq(eigenPod.sumOfPartialWithdrawalsClaimedGwei(), partialWithdrawalAmountGwei, "Incorrect partial withdrawal amount"); - // assertEq(vw.amountToSendGwei, partialWithdrawalAmountGwei, "Amount to send via router is not correct"); - // assertEq(vw.sharesDeltaGwei, 0, "Shares delta should be 0"); - // } - - // function _setWithdrawalProofParams() internal { - // // Set validator index, beacon state root, balance update proof, and validator fields - // beaconStateRoot = getBeaconStateRoot(); - // validatorFields = getValidatorFields(); - // validatorFieldsProof = abi.encodePacked(getValidatorProof()); - // withdrawalToProve = _getWithdrawalProof(); - // withdrawalFields = getWithdrawalFields(); - // } - - /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - // { - // bytes32 blockRoot = getBlockRoot(); - // bytes32 slotRoot = getSlotRoot(); - // bytes32 timestampRoot = getTimestampRoot(); - // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - // bytes memory withdrawalProof = IS_DENEB ? abi.encodePacked(getWithdrawalProofDeneb()) : abi.encodePacked(getWithdrawalProofCapella()); - // bytes memory timestampProof = IS_DENEB ? abi.encodePacked(getTimestampProofDeneb()) : abi.encodePacked(getTimestampProofCapella()); - // return - // BeaconChainProofs.WithdrawalProof( - // abi.encodePacked(withdrawalProof), - // abi.encodePacked(getSlotProof()), - // abi.encodePacked(getExecutionPayloadProof()), - // abi.encodePacked(timestampProof), - // abi.encodePacked(getHistoricalSummaryProof()), - // uint64(getBlockRootIndex()), - // uint64(getHistoricalSummaryIndex()), - // uint64(getWithdrawalIndex()), - // blockRoot, - // slotRoot, - // timestampRoot, - // executionPayloadRoot - // ); - // } - // } ///@notice Effective balance is > 32 ETH modifier setWithdrawalCredentialsExcess() { @@ -1066,16 +1753,15 @@ contract EigenPodUnitTests_WithdrawalTests is EigenPodHarnessSetup, ProofParsing setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); // Set beacon state root, validatorIndex beaconStateRoot = getBeaconStateRoot(); - uint40 validatorIndex = uint40(getValidatorIndex()); + validatorIndex = uint40(getValidatorIndex()); validatorFieldsProof = getWithdrawalCredentialProof(); // Validator fields are proven here validatorFields = getValidatorFields(); // Get an oracle timestamp - cheats.warp(GOERLI_GENESIS_TIME + 1 days); - uint64 oracleTimestamp = uint64(block.timestamp); + cheats.warp(GENESIS_TIME_LOCAL + 1 days); + oracleTimestamp = uint64(block.timestamp); eigenPodHarness.verifyWithdrawalCredentials( - oracleTimestamp, beaconStateRoot, validatorIndex, validatorFieldsProof, diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol index 5c8d86a4d..a7a1b5294 100644 --- a/src/test/utils/EigenLayerUnitTestSetup.sol +++ b/src/test/utils/EigenLayerUnitTestSetup.sol @@ -19,7 +19,7 @@ abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { strategyManagerMock = new StrategyManagerMock(); delegationManagerMock = new DelegationManagerMock(); slasherMock = new SlasherMock(); - eigenPodManagerMock = new EigenPodManagerMock(); + eigenPodManagerMock = new EigenPodManagerMock(pauserRegistry); addressIsExcludedFromFuzzedInputs[address(0)] = true; addressIsExcludedFromFuzzedInputs[address(strategyManagerMock)] = true; diff --git a/src/test/utils/EigenPodUser.t.sol b/src/test/utils/EigenPodUser.t.sol new file mode 100644 index 000000000..8e62b26ef --- /dev/null +++ b/src/test/utils/EigenPodUser.t.sol @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "forge-std/Test.sol"; + +import "src/contracts/pods/EigenPodManager.sol"; +import "src/contracts/pods/EigenPod.sol"; + +import "src/contracts/interfaces/IStrategy.sol"; + +import "src/test/integration/TimeMachine.t.sol"; +import "src/test/integration/mocks/BeaconChainMock.t.sol"; +import "src/test/integration/utils/PrintUtils.t.sol"; + +struct Validator { + uint40 index; +} + +interface IUserDeployer { + function timeMachine() external view returns (TimeMachine); + function beaconChain() external view returns (BeaconChainMock); + function eigenPodBeacon() external view returns (IBeacon); +} + +contract EigenPodUser is PrintUtils { + + Vm cheats = Vm(HEVM_ADDRESS); + + TimeMachine timeMachine; + BeaconChainMock beaconChain; + IBeacon public eigenPodBeacon; + + + string _NAME; + + // User's EigenPod and each of their validator indices within that pod + EigenPod public pod; + uint40[] validators; + + IStrategy constant BEACONCHAIN_ETH_STRAT = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); + IERC20 constant NATIVE_ETH = IERC20(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); + uint constant GWEI_TO_WEI = 1e9; + + bytes internal constant beaconProxyBytecode = + hex"608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564"; + + constructor(string memory name) { + IUserDeployer deployer = IUserDeployer(msg.sender); + + timeMachine = deployer.timeMachine(); + beaconChain = deployer.beaconChain(); + eigenPodBeacon = deployer.eigenPodBeacon(); + pod = EigenPod(payable( + Create2.deploy( + 0, + bytes32(uint256(uint160(address(this)))), + // set the beacon address to the eigenPodBeacon + abi.encodePacked(beaconProxyBytecode, abi.encode(eigenPodBeacon, "")) + ))); + pod.initialize(address(this)); + + _NAME = name; + } + + modifier createSnapshot() virtual { + timeMachine.createSnapshot(); + _; + } + + receive() external payable {} + + function NAME() public view override returns (string memory) { + return _NAME; + } + + /******************************************************************************* + BEACON CHAIN METHODS + *******************************************************************************/ + + /// @dev Uses any ETH held by the User to start validators on the beacon chain + /// @return A list of created validator indices + /// @return The amount of wei sent to the beacon chain + /// Note: If the user does not have enough ETH to start a validator, this method reverts + /// Note: This method also advances one epoch forward on the beacon chain, so that + /// withdrawal credential proofs are generated for each validator. + function startValidators() public createSnapshot virtual returns (uint40[] memory, uint) { + _logM("startValidators"); + + return _startValidators(); + } + + function exitValidators(uint40[] memory _validators) public createSnapshot virtual returns (uint64 exitedBalanceGwei) { + _logM("exitValidators"); + + return _exitValidators(_validators); + } + + /******************************************************************************* + EIGENPOD METHODS + *******************************************************************************/ + + function verifyWithdrawalCredentials( + uint40[] memory _validators + ) public createSnapshot virtual { + _logM("verifyWithdrawalCredentials"); + + _verifyWithdrawalCredentials(_validators); + } + + function startCheckpoint() public createSnapshot virtual { + _logM("startCheckpoint"); + + _startCheckpoint(); + } + + function completeCheckpoint() public createSnapshot virtual { + _logM("completeCheckpoint"); + + _completeCheckpoint(); + } + + /******************************************************************************* + INTERNAL METHODS + *******************************************************************************/ + + /// @dev Uses any ETH held by the User to start validators on the beacon chain + /// @return A list of created validator indices + /// @return The amount of wei sent to the beacon chain + /// Note: If the user does not have enough ETH to start a validator, this method reverts + /// Note: This method also advances one epoch forward on the beacon chain, so that + /// withdrawal credential proofs are generated for each validator. + function _startValidators() internal returns (uint40[] memory, uint) { + uint balanceWei = address(this).balance; + + // Number of full validators: balance / 32 ETH + uint numValidators = balanceWei / 32 ether; + balanceWei -= (numValidators * 32 ether); + + // If we still have at least 1 ETH left over, we can create another (non-full) validator + // Note that in the mock beacon chain this validator will generate rewards like any other. + // The main point is to ensure pods are able to handle validators that have less than 32 ETH + uint lastValidatorBalance; + uint totalValidators = numValidators; + if (balanceWei >= 1 ether) { + lastValidatorBalance = balanceWei - (balanceWei % 1 gwei); + balanceWei -= lastValidatorBalance; + totalValidators++; + } + + require(totalValidators != 0, "startValidators: not enough ETH to start a validator"); + uint40[] memory newValidators = new uint40[](totalValidators); + uint totalBeaconBalance = address(this).balance - balanceWei; + + _log("- creating new validators", newValidators.length); + _log("- depositing balance to beacon chain (wei)", totalBeaconBalance); + + // Create each of the full validators + for (uint i = 0; i < numValidators; i++) { + uint40 validatorIndex = beaconChain.newValidator{ + value: 32 ether + }(_podWithdrawalCredentials()); + + newValidators[i] = validatorIndex; + validators.push(validatorIndex); + } + + // If we had a remainder, create the final, non-full validator + if (totalValidators == numValidators + 1) { + uint40 validatorIndex = beaconChain.newValidator{ + value: lastValidatorBalance + }(_podWithdrawalCredentials()); + + newValidators[newValidators.length - 1] = validatorIndex; + validators.push(validatorIndex); + } + + // Advance forward one epoch and generate withdrawal and balance proofs for each validator + beaconChain.advanceEpoch_NoRewards(); + + return (newValidators, totalBeaconBalance); + } + + function _exitValidators(uint40[] memory _validators) internal returns (uint64 exitedBalanceGwei) { + _log("- exiting num validators", _validators.length); + + for (uint i = 0; i < _validators.length; i++) { + exitedBalanceGwei += beaconChain.exitValidator(_validators[i]); + } + + _log("- exited balance to pod (gwei)", exitedBalanceGwei); + + return exitedBalanceGwei; + } + + function _startCheckpoint() internal { + pod.startCheckpoint(false); + } + + function _completeCheckpoint() internal { + _log("- active validator count", pod.activeValidatorCount()); + _log("- proofs remaining", pod.currentCheckpoint().proofsRemaining); + + uint64 checkpointTimestamp = pod.currentCheckpointTimestamp(); + if (checkpointTimestamp == 0) { + revert("User._completeCheckpoint: no existing checkpoint"); + } + + CheckpointProofs memory proofs = beaconChain.getCheckpointProofs(validators, checkpointTimestamp); + _log("- submitting num checkpoint proofs", proofs.balanceProofs.length); + + pod.verifyCheckpointProofs({ + balanceContainerProof: proofs.balanceContainerProof, + proofs: proofs.balanceProofs + }); + } + + function _verifyWithdrawalCredentials(uint40[] memory _validators) internal { + CredentialProofs memory proofs = beaconChain.getCredentialProofs(_validators); + + pod.verifyWithdrawalCredentials({ + beaconTimestamp: proofs.beaconTimestamp, + stateRootProof: proofs.stateRootProof, + validatorIndices: _validators, + validatorFieldsProofs: proofs.validatorFieldsProofs, + validatorFields: proofs.validatorFields + }); + } + + function _podWithdrawalCredentials() internal view returns (bytes memory) { + return abi.encodePacked(bytes1(uint8(1)), bytes11(0), address(pod)); + } + + function getActiveValidators() public view returns (uint40[] memory) { + uint40[] memory activeValidators = new uint40[](validators.length); + + uint numActive; + uint pos; + for(uint i = 0; i < validators.length; i++) { + if (beaconChain.isActive(validators[i])) { + activeValidators[pos] = validators[i]; + numActive++; + pos++; + } + } + + // Manually update length + assembly { mstore(activeValidators, numActive) } + + return activeValidators; + } +} \ No newline at end of file From 35be76539021c51d8e52f58a1867bd9fd532c3a8 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:51:08 -0400 Subject: [PATCH 27/85] chore: cleanup dwr and unused code (#593) * chore: cleanup dwr and unused code * chore: comment out pod specs --- certora/harnesses/EigenPodHarness.sol | 3 +- certora/scripts/core/verifyStrategyManager.sh | 2 +- certora/scripts/pods/verifyEigenPod.sh | 34 +- certora/scripts/pods/verifyEigenPodManager.sh | 26 +- certora/specs/core/DelegationManager.spec | 3 - certora/specs/core/Slasher.spec | 3 - certora/specs/core/StrategyManager.spec | 3 - certora/specs/pods/EigenPod.spec | 4 - certora/specs/pods/EigenPodManager.spec | 4 - pkg/bindings/AVSDirectory/binding.go | 2 +- .../DelayedWithdrawalRouter/binding.go | 1969 ----------------- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/IBeaconChainOracle/binding.go | 212 -- .../IDelayedWithdrawalRouter/binding.go | 902 -------- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- .../goerli/M1_deploy_goerli.config.json | 54 - .../devnet/M2_Deploy_From_Scratch.s.sol | 76 +- script/deploy/goerli/GoerliUpgrade1.s.sol | 88 - script/deploy/goerli/GoerliUpgrade2.s.sol | 127 -- .../holesky/M2_Deploy_From_Scratch.s.sol | 17 - .../EigenPod_Minor_Upgrade_Deploy.s.sol | 6 +- script/deploy/mainnet/M1_Deploy.s.sol | 72 +- script/deploy/mainnet/M2Deploy.s.sol | 29 +- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 24 +- .../M2_from_scratch_deployment_data.json | 47 +- .../goerli/GV2_deployment_2024_6_2.json | 30 - .../GV2_preprod_deployment_2024_30_1.json | 30 - .../M1_deployment_goerli_2023_3_23.json | 37 - .../goerli/M2_deployment_data_goerli.json | 19 - .../M2_preprod_deployment_from_scratch.json | 33 - script/output/goerli/deployment_output.json | 29 - script/utils/ExistingDeploymentParser.sol | 79 - .../interfaces/IBeaconChainOracle.sol | 12 - .../interfaces/IDelayedWithdrawalRouter.sol | 71 - src/contracts/interfaces/IEigenPod.sol | 1 - src/contracts/interfaces/IEigenPodManager.sol | 1 - .../pods/DelayedWithdrawalRouter.sol | 238 -- src/contracts/pods/EigenPodManager.sol | 2 - src/contracts/pods/EigenPodManagerStorage.sol | 2 +- src/test/DepositWithdraw.t.sol | 3 - src/test/EigenLayerDeployer.t.sol | 91 - src/test/EigenPod.t.sol | 933 -------- src/test/events/IEigenPodManagerEvents.sol | 3 - .../integration/IntegrationDeployer.t.sol | 31 - .../mainnet/IEigenPod.sol | 1 - .../integration/mocks/BeaconChainMock.t.sol | 8 +- .../mocks/BeaconChainOracleMock.t.sol | 17 - .../integration/tests/Upgrade_Setup.t.sol | 5 - .../VerifyWC_StartCP_CompleteCP.t.sol | 2 +- src/test/mocks/BeaconChainOracleMock.sol | 53 - .../mocks/DelayedWithdrawalRouterMock.sol | 52 - src/test/mocks/IBeaconChainOracleMock.sol | 67 - .../unit/DelayedWithdrawalRouterUnit.t.sol | 475 ---- src/test/unit/EigenPod-PodManagerUnit.t.sol | 642 ------ src/test/unit/EigenPodUnit.t.sol | 7 +- 61 files changed, 90 insertions(+), 6607 deletions(-) delete mode 100644 pkg/bindings/DelayedWithdrawalRouter/binding.go delete mode 100644 pkg/bindings/IBeaconChainOracle/binding.go delete mode 100644 pkg/bindings/IDelayedWithdrawalRouter/binding.go delete mode 100644 script/configs/goerli/M1_deploy_goerli.config.json delete mode 100644 script/deploy/goerli/GoerliUpgrade1.s.sol delete mode 100644 script/deploy/goerli/GoerliUpgrade2.s.sol delete mode 100644 script/output/goerli/GV2_deployment_2024_6_2.json delete mode 100644 script/output/goerli/GV2_preprod_deployment_2024_30_1.json delete mode 100644 script/output/goerli/M1_deployment_goerli_2023_3_23.json delete mode 100644 script/output/goerli/M2_deployment_data_goerli.json delete mode 100644 script/output/goerli/M2_preprod_deployment_from_scratch.json delete mode 100644 script/output/goerli/deployment_output.json delete mode 100644 src/contracts/interfaces/IBeaconChainOracle.sol delete mode 100644 src/contracts/interfaces/IDelayedWithdrawalRouter.sol delete mode 100644 src/contracts/pods/DelayedWithdrawalRouter.sol delete mode 100644 src/test/EigenPod.t.sol delete mode 100644 src/test/integration/mocks/BeaconChainOracleMock.t.sol delete mode 100644 src/test/mocks/BeaconChainOracleMock.sol delete mode 100644 src/test/mocks/DelayedWithdrawalRouterMock.sol delete mode 100644 src/test/mocks/IBeaconChainOracleMock.sol delete mode 100644 src/test/unit/DelayedWithdrawalRouterUnit.t.sol delete mode 100644 src/test/unit/EigenPod-PodManagerUnit.t.sol diff --git a/certora/harnesses/EigenPodHarness.sol b/certora/harnesses/EigenPodHarness.sol index 0462b9e1a..1845cff7a 100644 --- a/certora/harnesses/EigenPodHarness.sol +++ b/certora/harnesses/EigenPodHarness.sol @@ -7,12 +7,11 @@ contract EigenPodHarness is EigenPod { constructor( IETHPOSDeposit _ethPOS, - IDelayedWithdrawalRouter _delayedWithdrawalRouter, IEigenPodManager _eigenPodManager, uint64 _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, uint64 _GENESIS_TIME ) - EigenPod(_ethPOS, _delayedWithdrawalRouter, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) {} + EigenPod(_ethPOS, _eigenPodManager, _MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, _GENESIS_TIME) {} function get_validatorIndex(bytes32 pubkeyHash) public view returns (uint64) { return _validatorPubkeyHashToInfo[pubkeyHash].validatorIndex; diff --git a/certora/scripts/core/verifyStrategyManager.sh b/certora/scripts/core/verifyStrategyManager.sh index 52a1aa25d..7b5f81007 100644 --- a/certora/scripts/core/verifyStrategyManager.sh +++ b/certora/scripts/core/verifyStrategyManager.sh @@ -7,7 +7,7 @@ solc-select use 0.8.12 certoraRun certora/harnesses/StrategyManagerHarness.sol \ lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ - src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol src/contracts/pods/DelayedWithdrawalRouter.sol \ + src/contracts/pods/EigenPodManager.sol src/contracts/pods/EigenPod.sol \ src/contracts/strategies/StrategyBase.sol src/contracts/core/DelegationManager.sol \ src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ --verify StrategyManagerHarness:certora/specs/core/StrategyManager.spec \ diff --git a/certora/scripts/pods/verifyEigenPod.sh b/certora/scripts/pods/verifyEigenPod.sh index ddfcb8181..d4bc140a8 100644 --- a/certora/scripts/pods/verifyEigenPod.sh +++ b/certora/scripts/pods/verifyEigenPod.sh @@ -3,21 +3,21 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +# solc-select use 0.8.12 -certoraRun certora/harnesses/EigenPodHarness.sol \ - src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \ - src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ - src/contracts/core/StrategyManager.sol \ - src/contracts/strategies/StrategyBase.sol \ - lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ - lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ - --verify EigenPodHarness:certora/specs/pods/EigenPod.spec \ - --optimistic_loop \ - --prover_args '-recursionEntryLimit 3' \ - --optimistic_hashing \ - --parametric_contracts EigenPodHarness \ - $RULE \ - --loop_iter 1 \ - --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ - --msg "EigenPod $1 $2" \ +# certoraRun certora/harnesses/EigenPodHarness.sol \ +# src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPodManager.sol \ +# src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ +# src/contracts/core/StrategyManager.sol \ +# src/contracts/strategies/StrategyBase.sol \ +# lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol \ +# lib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sol \ +# --verify EigenPodHarness:certora/specs/pods/EigenPod.spec \ +# --optimistic_loop \ +# --prover_args '-recursionEntryLimit 3' \ +# --optimistic_hashing \ +# --parametric_contracts EigenPodHarness \ +# $RULE \ +# --loop_iter 1 \ +# --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ +# --msg "EigenPod $1 $2" \ diff --git a/certora/scripts/pods/verifyEigenPodManager.sh b/certora/scripts/pods/verifyEigenPodManager.sh index be315b558..428f89ba3 100644 --- a/certora/scripts/pods/verifyEigenPodManager.sh +++ b/certora/scripts/pods/verifyEigenPodManager.sh @@ -3,17 +3,17 @@ then RULE="--rule $2" fi -solc-select use 0.8.12 +# solc-select use 0.8.12 -certoraRun certora/harnesses/EigenPodManagerHarness.sol \ - src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \ - src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ - --verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \ - --optimistic_loop \ - --optimistic_fallback \ - --optimistic_hashing \ - --parametric_contracts EigenPodManagerHarness \ - $RULE \ - --loop_iter 3 \ - --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ - --msg "EigenPodManager $1 $2" \ +# certoraRun certora/harnesses/EigenPodManagerHarness.sol \ +# src/contracts/core/DelegationManager.sol src/contracts/pods/EigenPod.sol src/contracts/strategies/StrategyBase.sol src/contracts/core/StrategyManager.sol \ +# src/contracts/core/Slasher.sol src/contracts/permissions/PauserRegistry.sol \ +# --verify EigenPodManagerHarness:certora/specs/pods/EigenPodManager.spec \ +# --optimistic_loop \ +# --optimistic_fallback \ +# --optimistic_hashing \ +# --parametric_contracts EigenPodManagerHarness \ +# $RULE \ +# --loop_iter 3 \ +# --packages @openzeppelin=lib/openzeppelin-contracts @openzeppelin-upgrades=lib/openzeppelin-contracts-upgradeable \ +# --msg "EigenPodManager $1 $2" \ diff --git a/certora/specs/core/DelegationManager.spec b/certora/specs/core/DelegationManager.spec index a575c6716..56a004e05 100644 --- a/certora/specs/core/DelegationManager.spec +++ b/certora/specs/core/DelegationManager.spec @@ -28,9 +28,6 @@ methods { // external calls to EigenPod function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); - - // external calls to DelayedWithdrawalRouter (from EigenPod) - function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); // external calls to PauserRegistry function _.isPauser(address) external => DISPATCHER(true); diff --git a/certora/specs/core/Slasher.spec b/certora/specs/core/Slasher.spec index 1ecdbd2de..c5d2013c9 100644 --- a/certora/specs/core/Slasher.spec +++ b/certora/specs/core/Slasher.spec @@ -27,9 +27,6 @@ methods { // external calls to EigenPod function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); - // external calls to DelayedWithdrawalRouter (from EigenPod) - function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); - // external calls to PauserRegistry function _.isPauser(address) external => DISPATCHER(true); function _.unpauser() external => DISPATCHER(true); diff --git a/certora/specs/core/StrategyManager.spec b/certora/specs/core/StrategyManager.spec index 43cd8e20f..58b157aea 100644 --- a/certora/specs/core/StrategyManager.spec +++ b/certora/specs/core/StrategyManager.spec @@ -31,9 +31,6 @@ methods { // external calls to EigenPod function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); - - // external calls to DelayedWithdrawalRouter (from EigenPod) - function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); // external calls to PauserRegistry function _.isPauser(address) external => DISPATCHER(true); diff --git a/certora/specs/pods/EigenPod.spec b/certora/specs/pods/EigenPod.spec index bd6f5b948..c644f573d 100644 --- a/certora/specs/pods/EigenPod.spec +++ b/certora/specs/pods/EigenPod.spec @@ -52,9 +52,6 @@ methods { // external calls to ETH2Deposit contract function _.deposit(bytes, bytes, bytes, bytes32) external => NONDET; - // external calls to DelayedWithdrawalRouter (from EigenPod) - function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); - // external calls to PauserRegistry function _.isPauser(address) external => DISPATCHER(true); function _.unpauser() external => DISPATCHER(true); @@ -75,7 +72,6 @@ methods { function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external returns (IEigenPod.ValidatorInfo) envfree; function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external returns (bool) envfree; function validatorStatus(bytes32 pubkeyHash) external returns (IEigenPod.VALIDATOR_STATUS) envfree; - function delayedWithdrawalRouter() external returns (address) envfree; function nonBeaconChainETHBalanceWei() external returns (uint256) envfree; // harnessed functions diff --git a/certora/specs/pods/EigenPodManager.spec b/certora/specs/pods/EigenPodManager.spec index 37bdc4182..57b2ad2a6 100644 --- a/certora/specs/pods/EigenPodManager.spec +++ b/certora/specs/pods/EigenPodManager.spec @@ -27,9 +27,6 @@ methods { // external calls to EigenPod function _.withdrawRestakedBeaconChainETH(address,uint256) external => DISPATCHER(true); - - // external calls to DelayedWithdrawalRouter (from EigenPod) - function _.createDelayedWithdrawal(address, address) external => DISPATCHER(true); // external calls to PauserRegistry function _.isPauser(address) external => DISPATCHER(true); @@ -40,7 +37,6 @@ methods { function getPod(address podOwner) external returns (address) envfree; function ethPOS() external returns (address) envfree; function eigenPodBeacon() external returns (address) envfree; - function beaconChainOracle() external returns (address) envfree; function getBlockRootAtTimestamp(uint64 timestamp) external returns (bytes32) envfree; function strategyManager() external returns (address) envfree; function slasher() external returns (address) envfree; diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index f2659170a..2b3c65911 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212208536dc62f571f91d17cdf69c7d9f957b76d36f66be94885d626ef2b1689aa09464736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220a2020ef684696852d4491824c67f0ea1865ab16ab6e0ab09f8b82050cfd82a3964736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go deleted file mode 100644 index f7d67f0b6..000000000 --- a/pkg/bindings/DelayedWithdrawalRouter/binding.go +++ /dev/null @@ -1,1969 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package DelayedWithdrawalRouter - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// IDelayedWithdrawalRouterDelayedWithdrawal is an auto generated low-level Go binding around an user-defined struct. -type IDelayedWithdrawalRouterDelayedWithdrawal struct { - Amount *big.Int - BlockCreated uint32 -} - -// IDelayedWithdrawalRouterUserDelayedWithdrawals is an auto generated low-level Go binding around an user-defined struct. -type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { - DelayedWithdrawalsCompleted *big.Int - DelayedWithdrawals []IDelayedWithdrawalRouterDelayedWithdrawal -} - -// DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. -var DelayedWithdrawalRouterMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea26469706673582212206659d5c395980dd8a87473a889557e49f84898f12e984648bf743a044c0f221564736f6c634300080c0033", -} - -// DelayedWithdrawalRouterABI is the input ABI used to generate the binding from. -// Deprecated: Use DelayedWithdrawalRouterMetaData.ABI instead. -var DelayedWithdrawalRouterABI = DelayedWithdrawalRouterMetaData.ABI - -// DelayedWithdrawalRouterBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use DelayedWithdrawalRouterMetaData.Bin instead. -var DelayedWithdrawalRouterBin = DelayedWithdrawalRouterMetaData.Bin - -// DeployDelayedWithdrawalRouter deploys a new Ethereum contract, binding an instance of DelayedWithdrawalRouter to it. -func DeployDelayedWithdrawalRouter(auth *bind.TransactOpts, backend bind.ContractBackend, _eigenPodManager common.Address) (common.Address, *types.Transaction, *DelayedWithdrawalRouter, error) { - parsed, err := DelayedWithdrawalRouterMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DelayedWithdrawalRouterBin), backend, _eigenPodManager) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &DelayedWithdrawalRouter{DelayedWithdrawalRouterCaller: DelayedWithdrawalRouterCaller{contract: contract}, DelayedWithdrawalRouterTransactor: DelayedWithdrawalRouterTransactor{contract: contract}, DelayedWithdrawalRouterFilterer: DelayedWithdrawalRouterFilterer{contract: contract}}, nil -} - -// DelayedWithdrawalRouter is an auto generated Go binding around an Ethereum contract. -type DelayedWithdrawalRouter struct { - DelayedWithdrawalRouterCaller // Read-only binding to the contract - DelayedWithdrawalRouterTransactor // Write-only binding to the contract - DelayedWithdrawalRouterFilterer // Log filterer for contract events -} - -// DelayedWithdrawalRouterCaller is an auto generated read-only Go binding around an Ethereum contract. -type DelayedWithdrawalRouterCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// DelayedWithdrawalRouterTransactor is an auto generated write-only Go binding around an Ethereum contract. -type DelayedWithdrawalRouterTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// DelayedWithdrawalRouterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type DelayedWithdrawalRouterFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// DelayedWithdrawalRouterSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type DelayedWithdrawalRouterSession struct { - Contract *DelayedWithdrawalRouter // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// DelayedWithdrawalRouterCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type DelayedWithdrawalRouterCallerSession struct { - Contract *DelayedWithdrawalRouterCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// DelayedWithdrawalRouterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type DelayedWithdrawalRouterTransactorSession struct { - Contract *DelayedWithdrawalRouterTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// DelayedWithdrawalRouterRaw is an auto generated low-level Go binding around an Ethereum contract. -type DelayedWithdrawalRouterRaw struct { - Contract *DelayedWithdrawalRouter // Generic contract binding to access the raw methods on -} - -// DelayedWithdrawalRouterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type DelayedWithdrawalRouterCallerRaw struct { - Contract *DelayedWithdrawalRouterCaller // Generic read-only contract binding to access the raw methods on -} - -// DelayedWithdrawalRouterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type DelayedWithdrawalRouterTransactorRaw struct { - Contract *DelayedWithdrawalRouterTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewDelayedWithdrawalRouter creates a new instance of DelayedWithdrawalRouter, bound to a specific deployed contract. -func NewDelayedWithdrawalRouter(address common.Address, backend bind.ContractBackend) (*DelayedWithdrawalRouter, error) { - contract, err := bindDelayedWithdrawalRouter(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouter{DelayedWithdrawalRouterCaller: DelayedWithdrawalRouterCaller{contract: contract}, DelayedWithdrawalRouterTransactor: DelayedWithdrawalRouterTransactor{contract: contract}, DelayedWithdrawalRouterFilterer: DelayedWithdrawalRouterFilterer{contract: contract}}, nil -} - -// NewDelayedWithdrawalRouterCaller creates a new read-only instance of DelayedWithdrawalRouter, bound to a specific deployed contract. -func NewDelayedWithdrawalRouterCaller(address common.Address, caller bind.ContractCaller) (*DelayedWithdrawalRouterCaller, error) { - contract, err := bindDelayedWithdrawalRouter(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterCaller{contract: contract}, nil -} - -// NewDelayedWithdrawalRouterTransactor creates a new write-only instance of DelayedWithdrawalRouter, bound to a specific deployed contract. -func NewDelayedWithdrawalRouterTransactor(address common.Address, transactor bind.ContractTransactor) (*DelayedWithdrawalRouterTransactor, error) { - contract, err := bindDelayedWithdrawalRouter(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterTransactor{contract: contract}, nil -} - -// NewDelayedWithdrawalRouterFilterer creates a new log filterer instance of DelayedWithdrawalRouter, bound to a specific deployed contract. -func NewDelayedWithdrawalRouterFilterer(address common.Address, filterer bind.ContractFilterer) (*DelayedWithdrawalRouterFilterer, error) { - contract, err := bindDelayedWithdrawalRouter(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterFilterer{contract: contract}, nil -} - -// bindDelayedWithdrawalRouter binds a generic wrapper to an already deployed contract. -func bindDelayedWithdrawalRouter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := DelayedWithdrawalRouterMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.DelayedWithdrawalRouterTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _DelayedWithdrawalRouter.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.contract.Transact(opts, method, params...) -} - -// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. -// -// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) MAXWITHDRAWALDELAYBLOCKS(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "MAX_WITHDRAWAL_DELAY_BLOCKS") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. -// -// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) MAXWITHDRAWALDELAYBLOCKS() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.MAXWITHDRAWALDELAYBLOCKS(&_DelayedWithdrawalRouter.CallOpts) -} - -// MAXWITHDRAWALDELAYBLOCKS is a free data retrieval call binding the contract method 0xca661c04. -// -// Solidity: function MAX_WITHDRAWAL_DELAY_BLOCKS() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) MAXWITHDRAWALDELAYBLOCKS() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.MAXWITHDRAWALDELAYBLOCKS(&_DelayedWithdrawalRouter.CallOpts) -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) CanClaimDelayedWithdrawal(opts *bind.CallOpts, user common.Address, index *big.Int) (bool, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "canClaimDelayedWithdrawal", user, index) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { - return _DelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_DelayedWithdrawalRouter.CallOpts, user, index) -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { - return _DelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_DelayedWithdrawalRouter.CallOpts, user, index) -} - -// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. -// -// Solidity: function eigenPodManager() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) EigenPodManager(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "eigenPodManager") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. -// -// Solidity: function eigenPodManager() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) EigenPodManager() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.EigenPodManager(&_DelayedWithdrawalRouter.CallOpts) -} - -// EigenPodManager is a free data retrieval call binding the contract method 0x4665bcda. -// -// Solidity: function eigenPodManager() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) EigenPodManager() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.EigenPodManager(&_DelayedWithdrawalRouter.CallOpts) -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) GetClaimableUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "getClaimableUserDelayedWithdrawals", user) - - if err != nil { - return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) GetUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "getUserDelayedWithdrawals", user) - - if err != nil { - return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Owner() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.Owner(&_DelayedWithdrawalRouter.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Owner() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.Owner(&_DelayedWithdrawalRouter.CallOpts) -} - -// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. -// -// Solidity: function paused(uint8 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Paused(opts *bind.CallOpts, index uint8) (bool, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "paused", index) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. -// -// Solidity: function paused(uint8 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Paused(index uint8) (bool, error) { - return _DelayedWithdrawalRouter.Contract.Paused(&_DelayedWithdrawalRouter.CallOpts, index) -} - -// Paused is a free data retrieval call binding the contract method 0x5ac86ab7. -// -// Solidity: function paused(uint8 index) view returns(bool) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Paused(index uint8) (bool, error) { - return _DelayedWithdrawalRouter.Contract.Paused(&_DelayedWithdrawalRouter.CallOpts, index) -} - -// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) Paused0(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "paused0") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Paused0() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.Paused0(&_DelayedWithdrawalRouter.CallOpts) -} - -// Paused0 is a free data retrieval call binding the contract method 0x5c975abb. -// -// Solidity: function paused() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) Paused0() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.Paused0(&_DelayedWithdrawalRouter.CallOpts) -} - -// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. -// -// Solidity: function pauserRegistry() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) PauserRegistry(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "pauserRegistry") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. -// -// Solidity: function pauserRegistry() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) PauserRegistry() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.PauserRegistry(&_DelayedWithdrawalRouter.CallOpts) -} - -// PauserRegistry is a free data retrieval call binding the contract method 0x886f1195. -// -// Solidity: function pauserRegistry() view returns(address) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) PauserRegistry() (common.Address, error) { - return _DelayedWithdrawalRouter.Contract.PauserRegistry(&_DelayedWithdrawalRouter.CallOpts) -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserDelayedWithdrawalByIndex(opts *bind.CallOpts, user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userDelayedWithdrawalByIndex", user, index) - - if err != nil { - return *new(IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterDelayedWithdrawal)).(*IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_DelayedWithdrawalRouter.CallOpts, user, index) -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _DelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_DelayedWithdrawalRouter.CallOpts, user, index) -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserWithdrawals(opts *bind.CallOpts, user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawals", user) - - if err != nil { - return *new(IDelayedWithdrawalRouterUserDelayedWithdrawals), err - } - - out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterUserDelayedWithdrawals)).(*IDelayedWithdrawalRouterUserDelayedWithdrawals) - - return out0, err - -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - return _DelayedWithdrawalRouter.Contract.UserWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - return _DelayedWithdrawalRouter.Contract.UserWithdrawals(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) UserWithdrawalsLength(opts *bind.CallOpts, user common.Address) (*big.Int, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawalsLength", user) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_DelayedWithdrawalRouter.CallOpts, user) -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCaller) WithdrawalDelayBlocks(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _DelayedWithdrawalRouter.contract.Call(opts, &out, "withdrawalDelayBlocks") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) WithdrawalDelayBlocks() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_DelayedWithdrawalRouter.CallOpts) -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterCallerSession) WithdrawalDelayBlocks() (*big.Int, error) { - return _DelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_DelayedWithdrawalRouter.CallOpts) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals(opts *bind.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals", maxNumberOfDelayedWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) ClaimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_DelayedWithdrawalRouter.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_DelayedWithdrawalRouter.TransactOpts, maxNumberOfDelayedWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals0(opts *bind.TransactOpts, recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals0", recipient, maxNumberOfDelayedWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_DelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfDelayedWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfDelayedWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_DelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfDelayedWithdrawalsToClaim) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) CreateDelayedWithdrawal(opts *bind.TransactOpts, podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "createDelayedWithdrawal", podOwner, recipient) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_DelayedWithdrawalRouter.TransactOpts, podOwner, recipient) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_DelayedWithdrawalRouter.TransactOpts, podOwner, recipient) -} - -// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. -// -// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Initialize(opts *bind.TransactOpts, initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "initialize", initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) -} - -// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. -// -// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Initialize(initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Initialize(&_DelayedWithdrawalRouter.TransactOpts, initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) -} - -// Initialize is a paid mutator transaction binding the contract method 0xeb990c59. -// -// Solidity: function initialize(address initOwner, address _pauserRegistry, uint256 initPausedStatus, uint256 _withdrawalDelayBlocks) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Initialize(initOwner common.Address, _pauserRegistry common.Address, initPausedStatus *big.Int, _withdrawalDelayBlocks *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Initialize(&_DelayedWithdrawalRouter.TransactOpts, initOwner, _pauserRegistry, initPausedStatus, _withdrawalDelayBlocks) -} - -// Pause is a paid mutator transaction binding the contract method 0x136439dd. -// -// Solidity: function pause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Pause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "pause", newPausedStatus) -} - -// Pause is a paid mutator transaction binding the contract method 0x136439dd. -// -// Solidity: function pause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Pause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) -} - -// Pause is a paid mutator transaction binding the contract method 0x136439dd. -// -// Solidity: function pause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Pause(newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Pause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) -} - -// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. -// -// Solidity: function pauseAll() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) PauseAll(opts *bind.TransactOpts) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "pauseAll") -} - -// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. -// -// Solidity: function pauseAll() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) PauseAll() (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.PauseAll(&_DelayedWithdrawalRouter.TransactOpts) -} - -// PauseAll is a paid mutator transaction binding the contract method 0x595c6a67. -// -// Solidity: function pauseAll() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) PauseAll() (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.PauseAll(&_DelayedWithdrawalRouter.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) RenounceOwnership() (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.RenounceOwnership(&_DelayedWithdrawalRouter.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.RenounceOwnership(&_DelayedWithdrawalRouter.TransactOpts) -} - -// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. -// -// Solidity: function setPauserRegistry(address newPauserRegistry) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) SetPauserRegistry(opts *bind.TransactOpts, newPauserRegistry common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "setPauserRegistry", newPauserRegistry) -} - -// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. -// -// Solidity: function setPauserRegistry(address newPauserRegistry) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.SetPauserRegistry(&_DelayedWithdrawalRouter.TransactOpts, newPauserRegistry) -} - -// SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. -// -// Solidity: function setPauserRegistry(address newPauserRegistry) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) SetPauserRegistry(newPauserRegistry common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.SetPauserRegistry(&_DelayedWithdrawalRouter.TransactOpts, newPauserRegistry) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) SetWithdrawalDelayBlocks(opts *bind.TransactOpts, newValue *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "setWithdrawalDelayBlocks", newValue) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_DelayedWithdrawalRouter.TransactOpts, newValue) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_DelayedWithdrawalRouter.TransactOpts, newValue) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.TransferOwnership(&_DelayedWithdrawalRouter.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.TransferOwnership(&_DelayedWithdrawalRouter.TransactOpts, newOwner) -} - -// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. -// -// Solidity: function unpause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactor) Unpause(opts *bind.TransactOpts, newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.contract.Transact(opts, "unpause", newPausedStatus) -} - -// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. -// -// Solidity: function unpause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Unpause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) -} - -// Unpause is a paid mutator transaction binding the contract method 0xfabc1cbc. -// -// Solidity: function unpause(uint256 newPausedStatus) returns() -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterTransactorSession) Unpause(newPausedStatus *big.Int) (*types.Transaction, error) { - return _DelayedWithdrawalRouter.Contract.Unpause(&_DelayedWithdrawalRouter.TransactOpts, newPausedStatus) -} - -// DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator is returned from FilterDelayedWithdrawalCreated and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalCreated events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator struct { - Event *DelayedWithdrawalRouterDelayedWithdrawalCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterDelayedWithdrawalCreated represents a DelayedWithdrawalCreated event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterDelayedWithdrawalCreated struct { - PodOwner common.Address - Recipient common.Address - Amount *big.Int - Index *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelayedWithdrawalCreated is a free log retrieval operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalCreated(opts *bind.FilterOpts) (*DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalCreated") - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterDelayedWithdrawalCreatedIterator{contract: _DelayedWithdrawalRouter.contract, event: "DelayedWithdrawalCreated", logs: logs, sub: sub}, nil -} - -// WatchDelayedWithdrawalCreated is a free log subscription operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalCreated(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterDelayedWithdrawalCreated) (event.Subscription, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalCreated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelayedWithdrawalCreated is a log parse operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalCreated(log types.Log) (*DelayedWithdrawalRouterDelayedWithdrawalCreated, error) { - event := new(DelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator is returned from FilterDelayedWithdrawalsClaimed and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalsClaimed events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator struct { - Event *DelayedWithdrawalRouterDelayedWithdrawalsClaimed // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterDelayedWithdrawalsClaimed represents a DelayedWithdrawalsClaimed event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterDelayedWithdrawalsClaimed struct { - Recipient common.Address - AmountClaimed *big.Int - DelayedWithdrawalsCompleted *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelayedWithdrawalsClaimed is a free log retrieval operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalsClaimed(opts *bind.FilterOpts) (*DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalsClaimed") - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator{contract: _DelayedWithdrawalRouter.contract, event: "DelayedWithdrawalsClaimed", logs: logs, sub: sub}, nil -} - -// WatchDelayedWithdrawalsClaimed is a free log subscription operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalsClaimed(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterDelayedWithdrawalsClaimed) (event.Subscription, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalsClaimed") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelayedWithdrawalsClaimed is a log parse operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalsClaimed(log types.Log) (*DelayedWithdrawalRouterDelayedWithdrawalsClaimed, error) { - event := new(DelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterInitializedIterator struct { - Event *DelayedWithdrawalRouterInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterInitialized represents a Initialized event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterInitialized struct { - Version uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterInitialized(opts *bind.FilterOpts) (*DelayedWithdrawalRouterInitializedIterator, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterInitializedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterInitialized) (event.Subscription, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterInitialized) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. -// -// Solidity: event Initialized(uint8 version) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseInitialized(log types.Log) (*DelayedWithdrawalRouterInitialized, error) { - event := new(DelayedWithdrawalRouterInitialized) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterOwnershipTransferredIterator struct { - Event *DelayedWithdrawalRouterOwnershipTransferred // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterOwnershipTransferredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterOwnershipTransferred represents a OwnershipTransferred event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*DelayedWithdrawalRouterOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterOwnershipTransferredIterator{contract: _DelayedWithdrawalRouter.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterOwnershipTransferred) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseOwnershipTransferred(log types.Log) (*DelayedWithdrawalRouterOwnershipTransferred, error) { - event := new(DelayedWithdrawalRouterOwnershipTransferred) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterPausedIterator struct { - Event *DelayedWithdrawalRouterPaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterPausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterPaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterPausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterPausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterPaused represents a Paused event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterPaused struct { - Account common.Address - NewPausedStatus *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPaused is a free log retrieval operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. -// -// Solidity: event Paused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterPaused(opts *bind.FilterOpts, account []common.Address) (*DelayedWithdrawalRouterPausedIterator, error) { - - var accountRule []interface{} - for _, accountItem := range account { - accountRule = append(accountRule, accountItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Paused", accountRule) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterPausedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Paused", logs: logs, sub: sub}, nil -} - -// WatchPaused is a free log subscription operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. -// -// Solidity: event Paused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterPaused, account []common.Address) (event.Subscription, error) { - - var accountRule []interface{} - for _, accountItem := range account { - accountRule = append(accountRule, accountItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Paused", accountRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterPaused) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Paused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePaused is a log parse operation binding the contract event 0xab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d. -// -// Solidity: event Paused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParsePaused(log types.Log) (*DelayedWithdrawalRouterPaused, error) { - event := new(DelayedWithdrawalRouterPaused) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Paused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterPauserRegistrySetIterator is returned from FilterPauserRegistrySet and is used to iterate over the raw logs and unpacked data for PauserRegistrySet events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterPauserRegistrySetIterator struct { - Event *DelayedWithdrawalRouterPauserRegistrySet // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterPauserRegistrySetIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterPauserRegistrySet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterPauserRegistrySet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterPauserRegistrySetIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterPauserRegistrySetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterPauserRegistrySet represents a PauserRegistrySet event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterPauserRegistrySet struct { - PauserRegistry common.Address - NewPauserRegistry common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPauserRegistrySet is a free log retrieval operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. -// -// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterPauserRegistrySet(opts *bind.FilterOpts) (*DelayedWithdrawalRouterPauserRegistrySetIterator, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "PauserRegistrySet") - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterPauserRegistrySetIterator{contract: _DelayedWithdrawalRouter.contract, event: "PauserRegistrySet", logs: logs, sub: sub}, nil -} - -// WatchPauserRegistrySet is a free log subscription operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. -// -// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchPauserRegistrySet(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterPauserRegistrySet) (event.Subscription, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "PauserRegistrySet") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterPauserRegistrySet) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParsePauserRegistrySet is a log parse operation binding the contract event 0x6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6. -// -// Solidity: event PauserRegistrySet(address pauserRegistry, address newPauserRegistry) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParsePauserRegistrySet(log types.Log) (*DelayedWithdrawalRouterPauserRegistrySet, error) { - event := new(DelayedWithdrawalRouterPauserRegistrySet) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "PauserRegistrySet", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterUnpausedIterator struct { - Event *DelayedWithdrawalRouterUnpaused // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterUnpausedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterUnpaused) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterUnpausedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterUnpausedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterUnpaused represents a Unpaused event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterUnpaused struct { - Account common.Address - NewPausedStatus *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUnpaused is a free log retrieval operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. -// -// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterUnpaused(opts *bind.FilterOpts, account []common.Address) (*DelayedWithdrawalRouterUnpausedIterator, error) { - - var accountRule []interface{} - for _, accountItem := range account { - accountRule = append(accountRule, accountItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "Unpaused", accountRule) - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterUnpausedIterator{contract: _DelayedWithdrawalRouter.contract, event: "Unpaused", logs: logs, sub: sub}, nil -} - -// WatchUnpaused is a free log subscription operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. -// -// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterUnpaused, account []common.Address) (event.Subscription, error) { - - var accountRule []interface{} - for _, accountItem := range account { - accountRule = append(accountRule, accountItem) - } - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "Unpaused", accountRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterUnpaused) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Unpaused", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUnpaused is a log parse operation binding the contract event 0x3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c. -// -// Solidity: event Unpaused(address indexed account, uint256 newPausedStatus) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseUnpaused(log types.Log) (*DelayedWithdrawalRouterUnpaused, error) { - event := new(DelayedWithdrawalRouterUnpaused) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "Unpaused", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator is returned from FilterWithdrawalDelayBlocksSet and is used to iterate over the raw logs and unpacked data for WithdrawalDelayBlocksSet events raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator struct { - Event *DelayedWithdrawalRouterWithdrawalDelayBlocksSet // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// DelayedWithdrawalRouterWithdrawalDelayBlocksSet represents a WithdrawalDelayBlocksSet event raised by the DelayedWithdrawalRouter contract. -type DelayedWithdrawalRouterWithdrawalDelayBlocksSet struct { - PreviousValue *big.Int - NewValue *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterWithdrawalDelayBlocksSet is a free log retrieval operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) FilterWithdrawalDelayBlocksSet(opts *bind.FilterOpts) (*DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.FilterLogs(opts, "WithdrawalDelayBlocksSet") - if err != nil { - return nil, err - } - return &DelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator{contract: _DelayedWithdrawalRouter.contract, event: "WithdrawalDelayBlocksSet", logs: logs, sub: sub}, nil -} - -// WatchWithdrawalDelayBlocksSet is a free log subscription operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) WatchWithdrawalDelayBlocksSet(opts *bind.WatchOpts, sink chan<- *DelayedWithdrawalRouterWithdrawalDelayBlocksSet) (event.Subscription, error) { - - logs, sub, err := _DelayedWithdrawalRouter.contract.WatchLogs(opts, "WithdrawalDelayBlocksSet") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseWithdrawalDelayBlocksSet is a log parse operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_DelayedWithdrawalRouter *DelayedWithdrawalRouterFilterer) ParseWithdrawalDelayBlocksSet(log types.Log) (*DelayedWithdrawalRouterWithdrawalDelayBlocksSet, error) { - event := new(DelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := _DelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index 61db14519..1516b0657 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,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\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212207ae6b85a83f15c46a9a5042dbc992a3a6e615a28c7c1dc8587a9c583ab25ce0964736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212201b096c99c4305b1dcc9e8eb1b08e356ac0c74d42cebda2c642e7c122705206b264736f6c634300080c0033", } // DelegationManagerABI 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 3ec052703..0d61cf6ab 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620049b2380380620049b2833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147946200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da701528181610f660152818161106b0152818161130b01528181611757015281816119000152612f9a015260008181610483015261113601526147946000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613adc565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9a565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c68565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc4565b610e11565b6040516101d99190613d3d565b34801561041957600080fd5b5061042d610428366004613d4b565b610e76565b6040516101d99190613d64565b34801561044657600080fd5b50610400610455366004613d4b565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dba565b610f23565b6101a36104d3366004613dd7565b611060565b3480156104e457600080fd5b5061042d6104f3366004613cc4565b61120d565b34801561050457600080fd5b506101a3610513366004613e6a565b611300565b34801561052457600080fd5b506101a3610533366004613e96565b61153d565b34801561054457600080fd5b506101a3610553366004613f87565b611714565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614058565b6118e7565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c0565b1561067e5760405162461bcd60e51b8152600401610675906140dd565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c0565b156107275760405162461bcd60e51b8152600401610675906140dd565b600061076d610736858061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d05565b60028111156107ed576107ed613d05565b8152505090506212750081604001516001600160401b031661080f9190614199565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d05565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5e92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d88565b87611f3d565b610a0b86356109f7878061413a565b610a0460208a018a6141b1565b8651612098565b610a1560006122af565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c0565b15610af15760405162461bcd60e51b8152600401610675906140dd565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d88565b89611f3d565b6000805b87811015610d7d57610d5f8a358a8a84818110610cfd57610cfd61423f565b9050602002016020810190610d129190614255565b898985818110610d2457610d2461423f565b9050602002810190610d3691906141b1565b898987818110610d4857610d4861423f565b9050602002810190610d5a919061413a565b612531565b610d699083614199565b915080610d758161427c565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0957610f09613d05565b6002811115610f1a57610f1a613d05565b90525092915050565b6033546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd991906140c0565b15610ff65760405162461bcd60e51b8152600401610675906140dd565b610fff826122af565b603454600160401b900460ff1661105c576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a85760405162461bcd60e51b815260040161067590614297565b346801bc16d674ec800000146111345760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611177612b78565b8888886040518863ffffffff1660e01b815260040161119b9695949392919061436d565b6000604051808303818588803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111fe9291906143bc565b60405180910390a15050505050565b6112356040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e5576112e5613d05565b60028111156112f6576112f6613d05565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113485760405162461bcd60e51b815260040161067590614297565b611356633b9aca00826143e6565b156113e05760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f0633b9aca00836143fa565b6034549091506001600160401b0390811690821611156114a95760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c79084906001600160401b031661440e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152691815260200190565b60405180910390a26115388383612bbd565b505050565b600054610100900460ff161580801561155d5750600054600160ff909116105b806115775750303b158015611577575060005460ff166001145b6115da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fd576000805461ff0019166101001790555b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173e5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906140c0565b156117e75760405162461bcd60e51b8152600401610675906140dd565b82518451146118725760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e0576118ce838583815181106118945761189461423f565b60200260200101518784815181106118ae576118ae61423f565b60200260200101516001600160a01b0316612bc79092919063ffffffff16565b806118d88161427c565b915050611875565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561194f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197391906140c0565b156119905760405162461bcd60e51b8152600401610675906140dd565b603a54600160401b90046001600160401b031680611a3c5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8c9087612c19565b6000805b85811015611ce05736878783818110611aab57611aab61423f565b9050602002810190611abd9190614436565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2e57611b2e613d05565b6002811115611b3f57611b3f613d05565b9052509050600181606001516002811115611b5c57611b5c613d05565b14611b68575050611cce565b856001600160401b031681604001516001600160401b031610611b8c575050611cce565b600080611b9c83898e3587612d95565b602089018051929450909250611bb182614456565b62ffffff16905250606087018051839190611bcd908390614475565b600f0b905250611bdd81876144c4565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8257611c82613d05565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd88161427c565b915050611a90565b506001600160401b038084166000908152603b6020526040812080548493919291611d0d918591166144c4565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb7565b600081600081518110611d4f57611d4f61423f565b60200260200101519050919050565b600081600381518110611d7357611d7361423f565b60200260200101516000801b14159050919050565b6000611d97611fff600c6144ef565b611daa6001600160401b0384164261450e565b10611e145760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5c91614525565b600060405180830381855afa9150503d8060008114611e97576040519150601f19603f3d011682016040523d82523d6000602084013e611e9c565b606091505b5091509150818015611eaf575060008151115b611f215760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f359190614537565b949350505050565b611f49600360206144ef565b611f5660208301836141b1565b905014611fcb5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201b611fdb60208301836141b1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130be565b61105c5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121135760405162461bcd60e51b815260206004820152604e602482015260008051602061473f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561212160286001614199565b61212b9190614199565b6121369060206144ef565b82146121a45760405162461bcd60e51b8152602060048201526043602482015260008051602061473f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e28686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d692505050565b9050600064ffffffffff83166121fa60286001614199565b600b901b17905061224585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130be565b6122a55760405162461bcd60e51b815260206004820152603d602482015260008051602061473f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123505760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d55760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f2633b9aca00476143fa565b6123fc919061440e565b905081801561241257506001600160401b038116155b156124855760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249b42611d88565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f681612eb7565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612570848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125df576125df613d05565b60028111156125f0576125f0613d05565b905250905060008160600151600281111561260d5761260d613d05565b146126b05760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338392505050565b6001600160401b0316146127805760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612788612b78565b61279190614550565b6127cd8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a892505050565b1461284e5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bd92505050565b905061289c8a87878b8b8e612098565b603980549060006128ac8361427c565b9091555050603a54600090600160401b90046001600160401b0316156128e457603a54600160401b90046001600160401b03166128f1565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c7576129c7613d05565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a6f633b9aca006001600160401b0384166144ef565b9b9a5050505050505050505050565b60008151603014612b075760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1e908490600090602001614574565b60408051601f1981840301815290829052612b3891614525565b602060405180830381855afa158015612b55573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e709190614537565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105c82826133d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115389084906134ee565b612c2560056003614199565b612c309060206144ef565b612c3d60208301836141b1565b905014612cc05760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d11612cd260208401846141b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130be565b6115385760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612dad8784886135c0565b9050816001600160401b0316816001600160401b031614612e2757612dd28183613737565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612eab5760398054906000612e55836145a3565b9091555050600260608a0152612e6a856145ba565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff1661303e576000633b9aca00826060015183604001516001600160401b0316612ee99190614475565b600f0b612ef691906145e1565b6040830151603480549293509091600090612f1b9084906001600160401b03166144c4565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130cc86858561374f565b1495945050505050565b600080600283516130e791906143fa565b90506000816001600160401b0381111561310357613103613eb3565b60405190808252806020026020018201604052801561312c578160200160208202803683370190505b50905060005b828110156132335760028561314783836144ef565b815181106131575761315761423f565b60200260200101518683600261316d91906144ef565b613178906001614199565b815181106131885761318861423f565b60200260200101516040516020016131aa929190918252602082015260400190565b60408051601f19818403018152908290526131c491614525565b602060405180830381855afa1580156131e1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132049190614537565b8282815181106132165761321661423f565b60209081029190910101528061322b8161427c565b915050613132565b5061323f6002836143fa565b91505b811561335f5760005b8281101561334c5760028261326083836144ef565b815181106132705761327061423f565b60200260200101518383600261328691906144ef565b613291906001614199565b815181106132a1576132a161423f565b60200260200101516040516020016132c3929190918252602082015260400190565b60408051601f19818403018152908290526132dd91614525565b602060405180830381855afa1580156132fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331d9190614537565b82828151811061332f5761332f61423f565b6020908102919091010152806133448161427c565b91505061324b565b506133586002836143fa565b9150613242565b806000815181106133725761337261423f565b602002602001015192505050919050565b6000610e708260068151811061339b5761339b61423f565b602002602001015161389b565b600081600181518110611d4f57611d4f61423f565b6000610e708260028151811061339b5761339b61423f565b804710156134255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50509050806115385760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613543826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139029092919063ffffffff16565b805190915015611538578080602001905181019061356191906140c0565b6115385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ce60266001614199565b6135d99060206144ef565b6135e660408401846141b1565b9050146136575760405162461bcd60e51b81526020600482015260446024820181905260008051602061473f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613664600485614666565b64ffffffffff1690506136be61367d60408501856141b1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130be565b61371e5760405162461bcd60e51b815260206004820152603e602482015260008051602061473f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372c836020013585613911565b9150505b9392505050565b60006137306001600160401b0380841690851661468a565b6000835160001415801561376e57506020845161376c91906143e6565b155b6137fd5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613891576138216002856143e6565b613854578151600052808601516020526020826040600060026107d05a03fa61384957600080fd5b60028404935061387f565b8086015160005281516020526020826040600060026107d05a03fa61387857600080fd5b6002840493505b61388a602082614199565b905061380e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f35848460008561393e565b60008061391f6004846146da565b61392a9060406146fe565b64ffffffffff169050611f3584821b61389b565b60608247101561399f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a129190614525565b60006040518083038185875af1925050503d8060008114613a4f576040519150601f19603f3d011682016040523d82523d6000602084013e613a54565b606091505b5091509150613a64828286613a6f565b979650505050505050565b60608315613a7e575081613730565b825115613a8e5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472b565b80356001600160401b0381168114613abf57600080fd5b919050565b600060408284031215613ad657600080fd5b50919050565b600080600060608486031215613af157600080fd5b613afa84613aa8565b925060208401356001600160401b0380821115613b1657600080fd5b613b2287838801613ac4565b93506040860135915080821115613b3857600080fd5b50613b4586828701613ac4565b9150509250925092565b60008083601f840112613b6157600080fd5b5081356001600160401b03811115613b7857600080fd5b6020830191508360208260051b8501011115613b9357600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb657600080fd5b613bbf89613aa8565b975060208901356001600160401b0380821115613bdb57600080fd5b613be78c838d01613ac4565b985060408b0135915080821115613bfd57600080fd5b613c098c838d01613b4f565b909850965060608b0135915080821115613c2257600080fd5b613c2e8c838d01613b4f565b909650945060808b0135915080821115613c4757600080fd5b50613c548b828c01613b4f565b999c989b5096995094979396929594505050565b600060208284031215613c7a57600080fd5b61373082613aa8565b60008083601f840112613c9557600080fd5b5081356001600160401b03811115613cac57600080fd5b602083019150836020828501011115613b9357600080fd5b60008060208385031215613cd757600080fd5b82356001600160401b03811115613ced57600080fd5b613cf985828601613c83565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3957634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e708284613d1b565b600060208284031215613d5d57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da56060840182613d1b565b5092915050565b80151581146130bb57600080fd5b600060208284031215613dcc57600080fd5b813561373081613dac565b600080600080600060608688031215613def57600080fd5b85356001600160401b0380821115613e0657600080fd5b613e1289838a01613c83565b90975095506020880135915080821115613e2b57600080fd5b50613e3888828901613c83565b96999598509660400135949350505050565b6001600160a01b03811681146130bb57600080fd5b8035613abf81613e4a565b60008060408385031215613e7d57600080fd5b8235613e8881613e4a565b946020939093013593505050565b600060208284031215613ea857600080fd5b813561373081613e4a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef157613ef1613eb3565b604052919050565b60006001600160401b03821115613f1257613f12613eb3565b5060051b60200190565b600082601f830112613f2d57600080fd5b81356020613f42613f3d83613ef9565b613ec9565b82815260059290921b84018101918181019086841115613f6157600080fd5b8286015b84811015613f7c5780358352918301918301613f65565b509695505050505050565b600080600060608486031215613f9c57600080fd5b83356001600160401b0380821115613fb357600080fd5b818601915086601f830112613fc757600080fd5b81356020613fd7613f3d83613ef9565b82815260059290921b8401810191818101908a841115613ff657600080fd5b948201945b8386101561401d57853561400e81613e4a565b82529482019490820190613ffb565b9750508701359250508082111561403357600080fd5b5061404086828701613f1c565b92505061404f60408501613e5f565b90509250925092565b60008060006040848603121561406d57600080fd5b83356001600160401b038082111561408457600080fd5b61409087838801613ac4565b945060208601359150808211156140a657600080fd5b506140b386828701613b4f565b9497909650939450505050565b6000602082840312156140d257600080fd5b815161373081613dac565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415157600080fd5b8301803591506001600160401b0382111561416b57600080fd5b6020019150600581901b3603821315613b9357600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ac576141ac614183565b500190565b6000808335601e198436030181126141c857600080fd5b8301803591506001600160401b038211156141e257600080fd5b602001915036819003821315613b9357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426757600080fd5b813564ffffffffff8116811461373057600080fd5b600060001982141561429057614290614183565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432c578181015183820152602001614314565b8381111561433b576000848401525b50505050565b60008151808452614359816020860160208601614311565b601f01601f19169290920160200192915050565b60808152600061438160808301888a6142e8565b82810360208401526143938188614341565b905082810360408401526143a88186886142e8565b915050826060830152979650505050505050565b602081526000611f356020830184866142e8565b634e487b7160e01b600052601260045260246000fd5b6000826143f5576143f56143d0565b500690565b600082614409576144096143d0565b500490565b60006001600160401b038381169083168181101561442e5761442e614183565b039392505050565b60008235605e1983360301811261444c57600080fd5b9190910192915050565b600062ffffff82168061446b5761446b614183565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561449f5761449f614183565b8260016001607f1b03190382128116156144bb576144bb614183565b50019392505050565b60006001600160401b038083168185168083038211156144e6576144e6614183565b01949350505050565b600081600019048311821515161561450957614509614183565b500290565b60008282101561452057614520614183565b500390565b6000825161444c818460208701614311565b60006020828403121561454957600080fd5b5051919050565b80516020808301519190811015613ad65760001960209190910360031b1b16919050565b60008351614586818460208801614311565b6001600160801b0319939093169190920190815260100192915050565b6000816145b2576145b2614183565b506000190190565b600081600f0b60016001607f1b03198114156145d8576145d8614183565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460757614607614183565b600160ff1b600087128281168783058912161561462657614626614183565b6000871292508782058712848416161561464257614642614183565b8785058712818416161561465857614658614183565b505050929093029392505050565b600064ffffffffff8084168061467e5761467e6143d0565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b5576146b5614183565b8160016001607f1b030183138116156146d0576146d0614183565b5090039392505050565b600064ffffffffff808416806146f2576146f26143d0565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472257614722614183565b02949350505050565b602081526000613730602083018461434156fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220f36012bb88f1c9174fbcd179803dbdc4f13532a7db8e80a11ea031dfc5967b7964736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b50604051620049b2380380620049b2833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147946200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da701528181610f660152818161106b0152818161130b01528181611757015281816119000152612f9a015260008181610483015261113601526147946000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613adc565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9a565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c68565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc4565b610e11565b6040516101d99190613d3d565b34801561041957600080fd5b5061042d610428366004613d4b565b610e76565b6040516101d99190613d64565b34801561044657600080fd5b50610400610455366004613d4b565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dba565b610f23565b6101a36104d3366004613dd7565b611060565b3480156104e457600080fd5b5061042d6104f3366004613cc4565b61120d565b34801561050457600080fd5b506101a3610513366004613e6a565b611300565b34801561052457600080fd5b506101a3610533366004613e96565b61153d565b34801561054457600080fd5b506101a3610553366004613f87565b611714565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614058565b6118e7565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c0565b1561067e5760405162461bcd60e51b8152600401610675906140dd565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c0565b156107275760405162461bcd60e51b8152600401610675906140dd565b600061076d610736858061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d05565b60028111156107ed576107ed613d05565b8152505090506212750081604001516001600160401b031661080f9190614199565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d05565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5e92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d88565b87611f3d565b610a0b86356109f7878061413a565b610a0460208a018a6141b1565b8651612098565b610a1560006122af565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c0565b15610af15760405162461bcd60e51b8152600401610675906140dd565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d88565b89611f3d565b6000805b87811015610d7d57610d5f8a358a8a84818110610cfd57610cfd61423f565b9050602002016020810190610d129190614255565b898985818110610d2457610d2461423f565b9050602002810190610d3691906141b1565b898987818110610d4857610d4861423f565b9050602002810190610d5a919061413a565b612531565b610d699083614199565b915080610d758161427c565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0957610f09613d05565b6002811115610f1a57610f1a613d05565b90525092915050565b6033546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd991906140c0565b15610ff65760405162461bcd60e51b8152600401610675906140dd565b610fff826122af565b603454600160401b900460ff1661105c576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a85760405162461bcd60e51b815260040161067590614297565b346801bc16d674ec800000146111345760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611177612b78565b8888886040518863ffffffff1660e01b815260040161119b9695949392919061436d565b6000604051808303818588803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111fe9291906143bc565b60405180910390a15050505050565b6112356040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e5576112e5613d05565b60028111156112f6576112f6613d05565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113485760405162461bcd60e51b815260040161067590614297565b611356633b9aca00826143e6565b156113e05760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f0633b9aca00836143fa565b6034549091506001600160401b0390811690821611156114a95760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c79084906001600160401b031661440e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152691815260200190565b60405180910390a26115388383612bbd565b505050565b600054610100900460ff161580801561155d5750600054600160ff909116105b806115775750303b158015611577575060005460ff166001145b6115da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fd576000805461ff0019166101001790555b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173e5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906140c0565b156117e75760405162461bcd60e51b8152600401610675906140dd565b82518451146118725760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e0576118ce838583815181106118945761189461423f565b60200260200101518784815181106118ae576118ae61423f565b60200260200101516001600160a01b0316612bc79092919063ffffffff16565b806118d88161427c565b915050611875565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561194f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197391906140c0565b156119905760405162461bcd60e51b8152600401610675906140dd565b603a54600160401b90046001600160401b031680611a3c5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8c9087612c19565b6000805b85811015611ce05736878783818110611aab57611aab61423f565b9050602002810190611abd9190614436565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2e57611b2e613d05565b6002811115611b3f57611b3f613d05565b9052509050600181606001516002811115611b5c57611b5c613d05565b14611b68575050611cce565b856001600160401b031681604001516001600160401b031610611b8c575050611cce565b600080611b9c83898e3587612d95565b602089018051929450909250611bb182614456565b62ffffff16905250606087018051839190611bcd908390614475565b600f0b905250611bdd81876144c4565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8257611c82613d05565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd88161427c565b915050611a90565b506001600160401b038084166000908152603b6020526040812080548493919291611d0d918591166144c4565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb7565b600081600081518110611d4f57611d4f61423f565b60200260200101519050919050565b600081600381518110611d7357611d7361423f565b60200260200101516000801b14159050919050565b6000611d97611fff600c6144ef565b611daa6001600160401b0384164261450e565b10611e145760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5c91614525565b600060405180830381855afa9150503d8060008114611e97576040519150601f19603f3d011682016040523d82523d6000602084013e611e9c565b606091505b5091509150818015611eaf575060008151115b611f215760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f359190614537565b949350505050565b611f49600360206144ef565b611f5660208301836141b1565b905014611fcb5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201b611fdb60208301836141b1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130be565b61105c5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121135760405162461bcd60e51b815260206004820152604e602482015260008051602061473f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561212160286001614199565b61212b9190614199565b6121369060206144ef565b82146121a45760405162461bcd60e51b8152602060048201526043602482015260008051602061473f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e28686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d692505050565b9050600064ffffffffff83166121fa60286001614199565b600b901b17905061224585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130be565b6122a55760405162461bcd60e51b815260206004820152603d602482015260008051602061473f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123505760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d55760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f2633b9aca00476143fa565b6123fc919061440e565b905081801561241257506001600160401b038116155b156124855760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249b42611d88565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f681612eb7565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612570848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125df576125df613d05565b60028111156125f0576125f0613d05565b905250905060008160600151600281111561260d5761260d613d05565b146126b05760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338392505050565b6001600160401b0316146127805760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612788612b78565b61279190614550565b6127cd8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a892505050565b1461284e5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bd92505050565b905061289c8a87878b8b8e612098565b603980549060006128ac8361427c565b9091555050603a54600090600160401b90046001600160401b0316156128e457603a54600160401b90046001600160401b03166128f1565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c7576129c7613d05565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a6f633b9aca006001600160401b0384166144ef565b9b9a5050505050505050505050565b60008151603014612b075760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1e908490600090602001614574565b60408051601f1981840301815290829052612b3891614525565b602060405180830381855afa158015612b55573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e709190614537565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105c82826133d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115389084906134ee565b612c2560056003614199565b612c309060206144ef565b612c3d60208301836141b1565b905014612cc05760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d11612cd260208401846141b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130be565b6115385760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612dad8784886135c0565b9050816001600160401b0316816001600160401b031614612e2757612dd28183613737565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612eab5760398054906000612e55836145a3565b9091555050600260608a0152612e6a856145ba565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff1661303e576000633b9aca00826060015183604001516001600160401b0316612ee99190614475565b600f0b612ef691906145e1565b6040830151603480549293509091600090612f1b9084906001600160401b03166144c4565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130cc86858561374f565b1495945050505050565b600080600283516130e791906143fa565b90506000816001600160401b0381111561310357613103613eb3565b60405190808252806020026020018201604052801561312c578160200160208202803683370190505b50905060005b828110156132335760028561314783836144ef565b815181106131575761315761423f565b60200260200101518683600261316d91906144ef565b613178906001614199565b815181106131885761318861423f565b60200260200101516040516020016131aa929190918252602082015260400190565b60408051601f19818403018152908290526131c491614525565b602060405180830381855afa1580156131e1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132049190614537565b8282815181106132165761321661423f565b60209081029190910101528061322b8161427c565b915050613132565b5061323f6002836143fa565b91505b811561335f5760005b8281101561334c5760028261326083836144ef565b815181106132705761327061423f565b60200260200101518383600261328691906144ef565b613291906001614199565b815181106132a1576132a161423f565b60200260200101516040516020016132c3929190918252602082015260400190565b60408051601f19818403018152908290526132dd91614525565b602060405180830381855afa1580156132fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331d9190614537565b82828151811061332f5761332f61423f565b6020908102919091010152806133448161427c565b91505061324b565b506133586002836143fa565b9150613242565b806000815181106133725761337261423f565b602002602001015192505050919050565b6000610e708260068151811061339b5761339b61423f565b602002602001015161389b565b600081600181518110611d4f57611d4f61423f565b6000610e708260028151811061339b5761339b61423f565b804710156134255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50509050806115385760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613543826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139029092919063ffffffff16565b805190915015611538578080602001905181019061356191906140c0565b6115385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ce60266001614199565b6135d99060206144ef565b6135e660408401846141b1565b9050146136575760405162461bcd60e51b81526020600482015260446024820181905260008051602061473f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613664600485614666565b64ffffffffff1690506136be61367d60408501856141b1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130be565b61371e5760405162461bcd60e51b815260206004820152603e602482015260008051602061473f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372c836020013585613911565b9150505b9392505050565b60006137306001600160401b0380841690851661468a565b6000835160001415801561376e57506020845161376c91906143e6565b155b6137fd5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613891576138216002856143e6565b613854578151600052808601516020526020826040600060026107d05a03fa61384957600080fd5b60028404935061387f565b8086015160005281516020526020826040600060026107d05a03fa61387857600080fd5b6002840493505b61388a602082614199565b905061380e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f35848460008561393e565b60008061391f6004846146da565b61392a9060406146fe565b64ffffffffff169050611f3584821b61389b565b60608247101561399f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a129190614525565b60006040518083038185875af1925050503d8060008114613a4f576040519150601f19603f3d011682016040523d82523d6000602084013e613a54565b606091505b5091509150613a64828286613a6f565b979650505050505050565b60608315613a7e575081613730565b825115613a8e5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472b565b80356001600160401b0381168114613abf57600080fd5b919050565b600060408284031215613ad657600080fd5b50919050565b600080600060608486031215613af157600080fd5b613afa84613aa8565b925060208401356001600160401b0380821115613b1657600080fd5b613b2287838801613ac4565b93506040860135915080821115613b3857600080fd5b50613b4586828701613ac4565b9150509250925092565b60008083601f840112613b6157600080fd5b5081356001600160401b03811115613b7857600080fd5b6020830191508360208260051b8501011115613b9357600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb657600080fd5b613bbf89613aa8565b975060208901356001600160401b0380821115613bdb57600080fd5b613be78c838d01613ac4565b985060408b0135915080821115613bfd57600080fd5b613c098c838d01613b4f565b909850965060608b0135915080821115613c2257600080fd5b613c2e8c838d01613b4f565b909650945060808b0135915080821115613c4757600080fd5b50613c548b828c01613b4f565b999c989b5096995094979396929594505050565b600060208284031215613c7a57600080fd5b61373082613aa8565b60008083601f840112613c9557600080fd5b5081356001600160401b03811115613cac57600080fd5b602083019150836020828501011115613b9357600080fd5b60008060208385031215613cd757600080fd5b82356001600160401b03811115613ced57600080fd5b613cf985828601613c83565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3957634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e708284613d1b565b600060208284031215613d5d57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da56060840182613d1b565b5092915050565b80151581146130bb57600080fd5b600060208284031215613dcc57600080fd5b813561373081613dac565b600080600080600060608688031215613def57600080fd5b85356001600160401b0380821115613e0657600080fd5b613e1289838a01613c83565b90975095506020880135915080821115613e2b57600080fd5b50613e3888828901613c83565b96999598509660400135949350505050565b6001600160a01b03811681146130bb57600080fd5b8035613abf81613e4a565b60008060408385031215613e7d57600080fd5b8235613e8881613e4a565b946020939093013593505050565b600060208284031215613ea857600080fd5b813561373081613e4a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef157613ef1613eb3565b604052919050565b60006001600160401b03821115613f1257613f12613eb3565b5060051b60200190565b600082601f830112613f2d57600080fd5b81356020613f42613f3d83613ef9565b613ec9565b82815260059290921b84018101918181019086841115613f6157600080fd5b8286015b84811015613f7c5780358352918301918301613f65565b509695505050505050565b600080600060608486031215613f9c57600080fd5b83356001600160401b0380821115613fb357600080fd5b818601915086601f830112613fc757600080fd5b81356020613fd7613f3d83613ef9565b82815260059290921b8401810191818101908a841115613ff657600080fd5b948201945b8386101561401d57853561400e81613e4a565b82529482019490820190613ffb565b9750508701359250508082111561403357600080fd5b5061404086828701613f1c565b92505061404f60408501613e5f565b90509250925092565b60008060006040848603121561406d57600080fd5b83356001600160401b038082111561408457600080fd5b61409087838801613ac4565b945060208601359150808211156140a657600080fd5b506140b386828701613b4f565b9497909650939450505050565b6000602082840312156140d257600080fd5b815161373081613dac565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415157600080fd5b8301803591506001600160401b0382111561416b57600080fd5b6020019150600581901b3603821315613b9357600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ac576141ac614183565b500190565b6000808335601e198436030181126141c857600080fd5b8301803591506001600160401b038211156141e257600080fd5b602001915036819003821315613b9357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426757600080fd5b813564ffffffffff8116811461373057600080fd5b600060001982141561429057614290614183565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432c578181015183820152602001614314565b8381111561433b576000848401525b50505050565b60008151808452614359816020860160208601614311565b601f01601f19169290920160200192915050565b60808152600061438160808301888a6142e8565b82810360208401526143938188614341565b905082810360408401526143a88186886142e8565b915050826060830152979650505050505050565b602081526000611f356020830184866142e8565b634e487b7160e01b600052601260045260246000fd5b6000826143f5576143f56143d0565b500690565b600082614409576144096143d0565b500490565b60006001600160401b038381169083168181101561442e5761442e614183565b039392505050565b60008235605e1983360301811261444c57600080fd5b9190910192915050565b600062ffffff82168061446b5761446b614183565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561449f5761449f614183565b8260016001607f1b03190382128116156144bb576144bb614183565b50019392505050565b60006001600160401b038083168185168083038211156144e6576144e6614183565b01949350505050565b600081600019048311821515161561450957614509614183565b500290565b60008282101561452057614520614183565b500390565b6000825161444c818460208701614311565b60006020828403121561454957600080fd5b5051919050565b80516020808301519190811015613ad65760001960209190910360031b1b16919050565b60008351614586818460208801614311565b6001600160801b0319939093169190920190815260100192915050565b6000816145b2576145b2614183565b506000190190565b600081600f0b60016001607f1b03198114156145d8576145d8614183565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460757614607614183565b600160ff1b600087128281168783058912161561462657614626614183565b6000871292508782058712848416161561464257614642614183565b8785058712818416161561465857614658614183565b505050929093029392505050565b600064ffffffffff8084168061467e5761467e6143d0565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b5576146b5614183565b8160016001607f1b030183138116156146d0576146d0614183565b5090039392505050565b600064ffffffffff808416806146f2576146f26143d0565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472257614722614183565b02949350505050565b602081526000613730602083018461434156fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa26469706673582212202a1f77ee477c1101b3918b3a4963ac2ee99a0a76b13e4b70e9b4fea6d2d0378a64736f6c634300080c0033", } // 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 2658e2aff..5e42c775e 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\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220be6e4f910f8ea4ea6f616543576975a29385c2cb33cc66c6425cd3cc8ff30df264736f6c634300080c0033", + Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a26469706673582212201d91474873f1f9666da47e29ea684bc3e5c714a0dd4f15579b6dac2513a51abb64736f6c634300080c0033", } // 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 7b2d04c6c..251959f4a 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212201ef0c8b20a2f3a48c65fb61e13deb07a5ed944e1aa4985de15e63066e60496d464736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220a4c040d9e2da8b5d43a459a5d81b42282f7f5d7494dd006947234324ced0db1264736f6c634300080c0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IBeaconChainOracle/binding.go b/pkg/bindings/IBeaconChainOracle/binding.go deleted file mode 100644 index f46878adf..000000000 --- a/pkg/bindings/IBeaconChainOracle/binding.go +++ /dev/null @@ -1,212 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package IBeaconChainOracle - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// IBeaconChainOracleMetaData contains all meta data concerning the IBeaconChainOracle contract. -var IBeaconChainOracleMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"timestampToBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"}]", -} - -// IBeaconChainOracleABI is the input ABI used to generate the binding from. -// Deprecated: Use IBeaconChainOracleMetaData.ABI instead. -var IBeaconChainOracleABI = IBeaconChainOracleMetaData.ABI - -// IBeaconChainOracle is an auto generated Go binding around an Ethereum contract. -type IBeaconChainOracle struct { - IBeaconChainOracleCaller // Read-only binding to the contract - IBeaconChainOracleTransactor // Write-only binding to the contract - IBeaconChainOracleFilterer // Log filterer for contract events -} - -// IBeaconChainOracleCaller is an auto generated read-only Go binding around an Ethereum contract. -type IBeaconChainOracleCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IBeaconChainOracleTransactor is an auto generated write-only Go binding around an Ethereum contract. -type IBeaconChainOracleTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IBeaconChainOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type IBeaconChainOracleFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IBeaconChainOracleSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type IBeaconChainOracleSession struct { - Contract *IBeaconChainOracle // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// IBeaconChainOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type IBeaconChainOracleCallerSession struct { - Contract *IBeaconChainOracleCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// IBeaconChainOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type IBeaconChainOracleTransactorSession struct { - Contract *IBeaconChainOracleTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// IBeaconChainOracleRaw is an auto generated low-level Go binding around an Ethereum contract. -type IBeaconChainOracleRaw struct { - Contract *IBeaconChainOracle // Generic contract binding to access the raw methods on -} - -// IBeaconChainOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type IBeaconChainOracleCallerRaw struct { - Contract *IBeaconChainOracleCaller // Generic read-only contract binding to access the raw methods on -} - -// IBeaconChainOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type IBeaconChainOracleTransactorRaw struct { - Contract *IBeaconChainOracleTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewIBeaconChainOracle creates a new instance of IBeaconChainOracle, bound to a specific deployed contract. -func NewIBeaconChainOracle(address common.Address, backend bind.ContractBackend) (*IBeaconChainOracle, error) { - contract, err := bindIBeaconChainOracle(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &IBeaconChainOracle{IBeaconChainOracleCaller: IBeaconChainOracleCaller{contract: contract}, IBeaconChainOracleTransactor: IBeaconChainOracleTransactor{contract: contract}, IBeaconChainOracleFilterer: IBeaconChainOracleFilterer{contract: contract}}, nil -} - -// NewIBeaconChainOracleCaller creates a new read-only instance of IBeaconChainOracle, bound to a specific deployed contract. -func NewIBeaconChainOracleCaller(address common.Address, caller bind.ContractCaller) (*IBeaconChainOracleCaller, error) { - contract, err := bindIBeaconChainOracle(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &IBeaconChainOracleCaller{contract: contract}, nil -} - -// NewIBeaconChainOracleTransactor creates a new write-only instance of IBeaconChainOracle, bound to a specific deployed contract. -func NewIBeaconChainOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*IBeaconChainOracleTransactor, error) { - contract, err := bindIBeaconChainOracle(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &IBeaconChainOracleTransactor{contract: contract}, nil -} - -// NewIBeaconChainOracleFilterer creates a new log filterer instance of IBeaconChainOracle, bound to a specific deployed contract. -func NewIBeaconChainOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*IBeaconChainOracleFilterer, error) { - contract, err := bindIBeaconChainOracle(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &IBeaconChainOracleFilterer{contract: contract}, nil -} - -// bindIBeaconChainOracle binds a generic wrapper to an already deployed contract. -func bindIBeaconChainOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := IBeaconChainOracleMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_IBeaconChainOracle *IBeaconChainOracleRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IBeaconChainOracle.Contract.IBeaconChainOracleCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_IBeaconChainOracle *IBeaconChainOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IBeaconChainOracle.Contract.IBeaconChainOracleTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_IBeaconChainOracle *IBeaconChainOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IBeaconChainOracle.Contract.IBeaconChainOracleTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_IBeaconChainOracle *IBeaconChainOracleCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IBeaconChainOracle.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_IBeaconChainOracle *IBeaconChainOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IBeaconChainOracle.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_IBeaconChainOracle *IBeaconChainOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IBeaconChainOracle.Contract.contract.Transact(opts, method, params...) -} - -// TimestampToBlockRoot is a free data retrieval call binding the contract method 0x643599f2. -// -// Solidity: function timestampToBlockRoot(uint256 timestamp) view returns(bytes32) -func (_IBeaconChainOracle *IBeaconChainOracleCaller) TimestampToBlockRoot(opts *bind.CallOpts, timestamp *big.Int) ([32]byte, error) { - var out []interface{} - err := _IBeaconChainOracle.contract.Call(opts, &out, "timestampToBlockRoot", timestamp) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// TimestampToBlockRoot is a free data retrieval call binding the contract method 0x643599f2. -// -// Solidity: function timestampToBlockRoot(uint256 timestamp) view returns(bytes32) -func (_IBeaconChainOracle *IBeaconChainOracleSession) TimestampToBlockRoot(timestamp *big.Int) ([32]byte, error) { - return _IBeaconChainOracle.Contract.TimestampToBlockRoot(&_IBeaconChainOracle.CallOpts, timestamp) -} - -// TimestampToBlockRoot is a free data retrieval call binding the contract method 0x643599f2. -// -// Solidity: function timestampToBlockRoot(uint256 timestamp) view returns(bytes32) -func (_IBeaconChainOracle *IBeaconChainOracleCallerSession) TimestampToBlockRoot(timestamp *big.Int) ([32]byte, error) { - return _IBeaconChainOracle.Contract.TimestampToBlockRoot(&_IBeaconChainOracle.CallOpts, timestamp) -} diff --git a/pkg/bindings/IDelayedWithdrawalRouter/binding.go b/pkg/bindings/IDelayedWithdrawalRouter/binding.go deleted file mode 100644 index 86d4473b4..000000000 --- a/pkg/bindings/IDelayedWithdrawalRouter/binding.go +++ /dev/null @@ -1,902 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package IDelayedWithdrawalRouter - -import ( - "errors" - "math/big" - "strings" - - ethereum "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = ethereum.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// IDelayedWithdrawalRouterDelayedWithdrawal is an auto generated low-level Go binding around an user-defined struct. -type IDelayedWithdrawalRouterDelayedWithdrawal struct { - Amount *big.Int - BlockCreated uint32 -} - -// IDelayedWithdrawalRouterUserDelayedWithdrawals is an auto generated low-level Go binding around an user-defined struct. -type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { - DelayedWithdrawalsCompleted *big.Int - DelayedWithdrawals []IDelayedWithdrawalRouterDelayedWithdrawal -} - -// IDelayedWithdrawalRouterMetaData contains all meta data concerning the IDelayedWithdrawalRouter contract. -var IDelayedWithdrawalRouterMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", -} - -// IDelayedWithdrawalRouterABI is the input ABI used to generate the binding from. -// Deprecated: Use IDelayedWithdrawalRouterMetaData.ABI instead. -var IDelayedWithdrawalRouterABI = IDelayedWithdrawalRouterMetaData.ABI - -// IDelayedWithdrawalRouter is an auto generated Go binding around an Ethereum contract. -type IDelayedWithdrawalRouter struct { - IDelayedWithdrawalRouterCaller // Read-only binding to the contract - IDelayedWithdrawalRouterTransactor // Write-only binding to the contract - IDelayedWithdrawalRouterFilterer // Log filterer for contract events -} - -// IDelayedWithdrawalRouterCaller is an auto generated read-only Go binding around an Ethereum contract. -type IDelayedWithdrawalRouterCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IDelayedWithdrawalRouterTransactor is an auto generated write-only Go binding around an Ethereum contract. -type IDelayedWithdrawalRouterTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IDelayedWithdrawalRouterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type IDelayedWithdrawalRouterFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// IDelayedWithdrawalRouterSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type IDelayedWithdrawalRouterSession struct { - Contract *IDelayedWithdrawalRouter // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// IDelayedWithdrawalRouterCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type IDelayedWithdrawalRouterCallerSession struct { - Contract *IDelayedWithdrawalRouterCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// IDelayedWithdrawalRouterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type IDelayedWithdrawalRouterTransactorSession struct { - Contract *IDelayedWithdrawalRouterTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// IDelayedWithdrawalRouterRaw is an auto generated low-level Go binding around an Ethereum contract. -type IDelayedWithdrawalRouterRaw struct { - Contract *IDelayedWithdrawalRouter // Generic contract binding to access the raw methods on -} - -// IDelayedWithdrawalRouterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type IDelayedWithdrawalRouterCallerRaw struct { - Contract *IDelayedWithdrawalRouterCaller // Generic read-only contract binding to access the raw methods on -} - -// IDelayedWithdrawalRouterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type IDelayedWithdrawalRouterTransactorRaw struct { - Contract *IDelayedWithdrawalRouterTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewIDelayedWithdrawalRouter creates a new instance of IDelayedWithdrawalRouter, bound to a specific deployed contract. -func NewIDelayedWithdrawalRouter(address common.Address, backend bind.ContractBackend) (*IDelayedWithdrawalRouter, error) { - contract, err := bindIDelayedWithdrawalRouter(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouter{IDelayedWithdrawalRouterCaller: IDelayedWithdrawalRouterCaller{contract: contract}, IDelayedWithdrawalRouterTransactor: IDelayedWithdrawalRouterTransactor{contract: contract}, IDelayedWithdrawalRouterFilterer: IDelayedWithdrawalRouterFilterer{contract: contract}}, nil -} - -// NewIDelayedWithdrawalRouterCaller creates a new read-only instance of IDelayedWithdrawalRouter, bound to a specific deployed contract. -func NewIDelayedWithdrawalRouterCaller(address common.Address, caller bind.ContractCaller) (*IDelayedWithdrawalRouterCaller, error) { - contract, err := bindIDelayedWithdrawalRouter(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterCaller{contract: contract}, nil -} - -// NewIDelayedWithdrawalRouterTransactor creates a new write-only instance of IDelayedWithdrawalRouter, bound to a specific deployed contract. -func NewIDelayedWithdrawalRouterTransactor(address common.Address, transactor bind.ContractTransactor) (*IDelayedWithdrawalRouterTransactor, error) { - contract, err := bindIDelayedWithdrawalRouter(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterTransactor{contract: contract}, nil -} - -// NewIDelayedWithdrawalRouterFilterer creates a new log filterer instance of IDelayedWithdrawalRouter, bound to a specific deployed contract. -func NewIDelayedWithdrawalRouterFilterer(address common.Address, filterer bind.ContractFilterer) (*IDelayedWithdrawalRouterFilterer, error) { - contract, err := bindIDelayedWithdrawalRouter(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterFilterer{contract: contract}, nil -} - -// bindIDelayedWithdrawalRouter binds a generic wrapper to an already deployed contract. -func bindIDelayedWithdrawalRouter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := IDelayedWithdrawalRouterMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IDelayedWithdrawalRouter.Contract.IDelayedWithdrawalRouterCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.IDelayedWithdrawalRouterTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.IDelayedWithdrawalRouterTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _IDelayedWithdrawalRouter.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.contract.Transact(opts, method, params...) -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) CanClaimDelayedWithdrawal(opts *bind.CallOpts, user common.Address, index *big.Int) (bool, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "canClaimDelayedWithdrawal", user, index) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { - return _IDelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_IDelayedWithdrawalRouter.CallOpts, user, index) -} - -// CanClaimDelayedWithdrawal is a free data retrieval call binding the contract method 0x75608896. -// -// Solidity: function canClaimDelayedWithdrawal(address user, uint256 index) view returns(bool) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) CanClaimDelayedWithdrawal(user common.Address, index *big.Int) (bool, error) { - return _IDelayedWithdrawalRouter.Contract.CanClaimDelayedWithdrawal(&_IDelayedWithdrawalRouter.CallOpts, user, index) -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) GetClaimableUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "getClaimableUserDelayedWithdrawals", user) - - if err != nil { - return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// GetClaimableUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x1f39d87f. -// -// Solidity: function getClaimableUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) GetClaimableUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.GetClaimableUserDelayedWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) GetUserDelayedWithdrawals(opts *bind.CallOpts, user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "getUserDelayedWithdrawals", user) - - if err != nil { - return *new([]IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new([]IDelayedWithdrawalRouterDelayedWithdrawal)).(*[]IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// GetUserDelayedWithdrawals is a free data retrieval call binding the contract method 0x3e1de008. -// -// Solidity: function getUserDelayedWithdrawals(address user) view returns((uint224,uint32)[]) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) GetUserDelayedWithdrawals(user common.Address) ([]IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.GetUserDelayedWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) UserDelayedWithdrawalByIndex(opts *bind.CallOpts, user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "userDelayedWithdrawalByIndex", user, index) - - if err != nil { - return *new(IDelayedWithdrawalRouterDelayedWithdrawal), err - } - - out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterDelayedWithdrawal)).(*IDelayedWithdrawalRouterDelayedWithdrawal) - - return out0, err - -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_IDelayedWithdrawalRouter.CallOpts, user, index) -} - -// UserDelayedWithdrawalByIndex is a free data retrieval call binding the contract method 0x85594e58. -// -// Solidity: function userDelayedWithdrawalByIndex(address user, uint256 index) view returns((uint224,uint32)) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) UserDelayedWithdrawalByIndex(user common.Address, index *big.Int) (IDelayedWithdrawalRouterDelayedWithdrawal, error) { - return _IDelayedWithdrawalRouter.Contract.UserDelayedWithdrawalByIndex(&_IDelayedWithdrawalRouter.CallOpts, user, index) -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) UserWithdrawals(opts *bind.CallOpts, user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawals", user) - - if err != nil { - return *new(IDelayedWithdrawalRouterUserDelayedWithdrawals), err - } - - out0 := *abi.ConvertType(out[0], new(IDelayedWithdrawalRouterUserDelayedWithdrawals)).(*IDelayedWithdrawalRouterUserDelayedWithdrawals) - - return out0, err - -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - return _IDelayedWithdrawalRouter.Contract.UserWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawals is a free data retrieval call binding the contract method 0xecb7cb1b. -// -// Solidity: function userWithdrawals(address user) view returns((uint256,(uint224,uint32)[])) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) UserWithdrawals(user common.Address) (IDelayedWithdrawalRouterUserDelayedWithdrawals, error) { - return _IDelayedWithdrawalRouter.Contract.UserWithdrawals(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) UserWithdrawalsLength(opts *bind.CallOpts, user common.Address) (*big.Int, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "userWithdrawalsLength", user) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { - return _IDelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// UserWithdrawalsLength is a free data retrieval call binding the contract method 0xe4f4f887. -// -// Solidity: function userWithdrawalsLength(address user) view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) UserWithdrawalsLength(user common.Address) (*big.Int, error) { - return _IDelayedWithdrawalRouter.Contract.UserWithdrawalsLength(&_IDelayedWithdrawalRouter.CallOpts, user) -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCaller) WithdrawalDelayBlocks(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _IDelayedWithdrawalRouter.contract.Call(opts, &out, "withdrawalDelayBlocks") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) WithdrawalDelayBlocks() (*big.Int, error) { - return _IDelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_IDelayedWithdrawalRouter.CallOpts) -} - -// WithdrawalDelayBlocks is a free data retrieval call binding the contract method 0x50f73e7c. -// -// Solidity: function withdrawalDelayBlocks() view returns(uint256) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterCallerSession) WithdrawalDelayBlocks() (*big.Int, error) { - return _IDelayedWithdrawalRouter.Contract.WithdrawalDelayBlocks(&_IDelayedWithdrawalRouter.CallOpts) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals(opts *bind.TransactOpts, maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals", maxNumberOfWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) ClaimDelayedWithdrawals(maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_IDelayedWithdrawalRouter.TransactOpts, maxNumberOfWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals is a paid mutator transaction binding the contract method 0xd44e1b76. -// -// Solidity: function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals(maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals(&_IDelayedWithdrawalRouter.TransactOpts, maxNumberOfWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactor) ClaimDelayedWithdrawals0(opts *bind.TransactOpts, recipient common.Address, maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.contract.Transact(opts, "claimDelayedWithdrawals0", recipient, maxNumberOfWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_IDelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfWithdrawalsToClaim) -} - -// ClaimDelayedWithdrawals0 is a paid mutator transaction binding the contract method 0xe5db06c0. -// -// Solidity: function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorSession) ClaimDelayedWithdrawals0(recipient common.Address, maxNumberOfWithdrawalsToClaim *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.ClaimDelayedWithdrawals0(&_IDelayedWithdrawalRouter.TransactOpts, recipient, maxNumberOfWithdrawalsToClaim) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactor) CreateDelayedWithdrawal(opts *bind.TransactOpts, podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.contract.Transact(opts, "createDelayedWithdrawal", podOwner, recipient) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_IDelayedWithdrawalRouter.TransactOpts, podOwner, recipient) -} - -// CreateDelayedWithdrawal is a paid mutator transaction binding the contract method 0xc0db354c. -// -// Solidity: function createDelayedWithdrawal(address podOwner, address recipient) payable returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorSession) CreateDelayedWithdrawal(podOwner common.Address, recipient common.Address) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.CreateDelayedWithdrawal(&_IDelayedWithdrawalRouter.TransactOpts, podOwner, recipient) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactor) SetWithdrawalDelayBlocks(opts *bind.TransactOpts, newValue *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.contract.Transact(opts, "setWithdrawalDelayBlocks", newValue) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_IDelayedWithdrawalRouter.TransactOpts, newValue) -} - -// SetWithdrawalDelayBlocks is a paid mutator transaction binding the contract method 0x4d50f9a4. -// -// Solidity: function setWithdrawalDelayBlocks(uint256 newValue) returns() -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterTransactorSession) SetWithdrawalDelayBlocks(newValue *big.Int) (*types.Transaction, error) { - return _IDelayedWithdrawalRouter.Contract.SetWithdrawalDelayBlocks(&_IDelayedWithdrawalRouter.TransactOpts, newValue) -} - -// IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator is returned from FilterDelayedWithdrawalCreated and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalCreated events raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator struct { - Event *IDelayedWithdrawalRouterDelayedWithdrawalCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IDelayedWithdrawalRouterDelayedWithdrawalCreated represents a DelayedWithdrawalCreated event raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterDelayedWithdrawalCreated struct { - PodOwner common.Address - Recipient common.Address - Amount *big.Int - Index *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelayedWithdrawalCreated is a free log retrieval operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalCreated(opts *bind.FilterOpts) (*IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalCreated") - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterDelayedWithdrawalCreatedIterator{contract: _IDelayedWithdrawalRouter.contract, event: "DelayedWithdrawalCreated", logs: logs, sub: sub}, nil -} - -// WatchDelayedWithdrawalCreated is a free log subscription operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalCreated(opts *bind.WatchOpts, sink chan<- *IDelayedWithdrawalRouterDelayedWithdrawalCreated) (event.Subscription, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalCreated") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IDelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelayedWithdrawalCreated is a log parse operation binding the contract event 0xb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f59. -// -// Solidity: event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalCreated(log types.Log) (*IDelayedWithdrawalRouterDelayedWithdrawalCreated, error) { - event := new(IDelayedWithdrawalRouterDelayedWithdrawalCreated) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator is returned from FilterDelayedWithdrawalsClaimed and is used to iterate over the raw logs and unpacked data for DelayedWithdrawalsClaimed events raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator struct { - Event *IDelayedWithdrawalRouterDelayedWithdrawalsClaimed // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IDelayedWithdrawalRouterDelayedWithdrawalsClaimed represents a DelayedWithdrawalsClaimed event raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterDelayedWithdrawalsClaimed struct { - Recipient common.Address - AmountClaimed *big.Int - DelayedWithdrawalsCompleted *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelayedWithdrawalsClaimed is a free log retrieval operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) FilterDelayedWithdrawalsClaimed(opts *bind.FilterOpts) (*IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.FilterLogs(opts, "DelayedWithdrawalsClaimed") - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterDelayedWithdrawalsClaimedIterator{contract: _IDelayedWithdrawalRouter.contract, event: "DelayedWithdrawalsClaimed", logs: logs, sub: sub}, nil -} - -// WatchDelayedWithdrawalsClaimed is a free log subscription operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) WatchDelayedWithdrawalsClaimed(opts *bind.WatchOpts, sink chan<- *IDelayedWithdrawalRouterDelayedWithdrawalsClaimed) (event.Subscription, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.WatchLogs(opts, "DelayedWithdrawalsClaimed") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IDelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelayedWithdrawalsClaimed is a log parse operation binding the contract event 0x6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943. -// -// Solidity: event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) ParseDelayedWithdrawalsClaimed(log types.Log) (*IDelayedWithdrawalRouterDelayedWithdrawalsClaimed, error) { - event := new(IDelayedWithdrawalRouterDelayedWithdrawalsClaimed) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "DelayedWithdrawalsClaimed", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator is returned from FilterWithdrawalDelayBlocksSet and is used to iterate over the raw logs and unpacked data for WithdrawalDelayBlocksSet events raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator struct { - Event *IDelayedWithdrawalRouterWithdrawalDelayBlocksSet // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IDelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IDelayedWithdrawalRouterWithdrawalDelayBlocksSet represents a WithdrawalDelayBlocksSet event raised by the IDelayedWithdrawalRouter contract. -type IDelayedWithdrawalRouterWithdrawalDelayBlocksSet struct { - PreviousValue *big.Int - NewValue *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterWithdrawalDelayBlocksSet is a free log retrieval operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) FilterWithdrawalDelayBlocksSet(opts *bind.FilterOpts) (*IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.FilterLogs(opts, "WithdrawalDelayBlocksSet") - if err != nil { - return nil, err - } - return &IDelayedWithdrawalRouterWithdrawalDelayBlocksSetIterator{contract: _IDelayedWithdrawalRouter.contract, event: "WithdrawalDelayBlocksSet", logs: logs, sub: sub}, nil -} - -// WatchWithdrawalDelayBlocksSet is a free log subscription operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) WatchWithdrawalDelayBlocksSet(opts *bind.WatchOpts, sink chan<- *IDelayedWithdrawalRouterWithdrawalDelayBlocksSet) (event.Subscription, error) { - - logs, sub, err := _IDelayedWithdrawalRouter.contract.WatchLogs(opts, "WithdrawalDelayBlocksSet") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IDelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseWithdrawalDelayBlocksSet is a log parse operation binding the contract event 0x4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e. -// -// Solidity: event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue) -func (_IDelayedWithdrawalRouter *IDelayedWithdrawalRouterFilterer) ParseWithdrawalDelayBlocksSet(log types.Log) (*IDelayedWithdrawalRouterWithdrawalDelayBlocksSet, error) { - event := new(IDelayedWithdrawalRouterWithdrawalDelayBlocksSet) - if err := _IDelayedWithdrawalRouter.contract.UnpackLog(event, "WithdrawalDelayBlocksSet", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index e8c724019..2936f8549 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212202a5b3d938225078efdada0b9d71e3deeea4719e5d4c7cd1e0d2aa8b50635717e64736f6c634300080c0033", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212201eb90134850afcdd79513fc55e294305ddb99fd305384bb83205e19b2f0186cc64736f6c634300080c0033", } // RewardsCoordinatorABI 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 14d8291cd..cd44b46af 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220b4694f0c37ad1fee59690c31bf2b0897379fc3409dbf92cc28eba62bfedb0f5e64736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212202c0d3a696a4bc78c96a2f786064e2548f833ad9688ec6ef91ab7322860e488bd64736f6c634300080c0033", } // 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 0c1e9f2e6..da72458ad 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220cf064cee51ffe744f589fb58d0cf8307f7349092672e7e45862555af0421ebcf64736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122012dfe692c1c4584ca56ce25007c31abc59a573b1667f2849cd03594099b5939764736f6c634300080c0033", } // StrategyBaseTVLLimitsABI 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 2eb0c81d0..5c66607c3 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea264697066735822122040c597deb658b4ead487d296bdbb35f977e07e3422fdc136e9eed8c93dd25a4164736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220130e44df653424e49b40ce0f697874f7c1190f6ee8bd0976aa4ad3f5d2047aad64736f6c634300080c0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/script/configs/goerli/M1_deploy_goerli.config.json b/script/configs/goerli/M1_deploy_goerli.config.json deleted file mode 100644 index c454fa4db..000000000 --- a/script/configs/goerli/M1_deploy_goerli.config.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "multisig_addresses": { - "pauserMultisig": "0x040353E9d057689b77DF275c07FFe1A46b98a4a6", - "communityMultisig": "0x37bAFb55BC02056c5fD891DFa503ee84a97d89bF", - "operationsMultisig": "0x040353E9d057689b77DF275c07FFe1A46b98a4a6", - "executorMultisig": "0x3d9C2c2B40d890ad53E27947402e977155CD2808", - "timelock": "0xA7e72a0564ebf25Fa082Fc27020225edeAF1796E" - }, - "strategies": [ - { - "token_address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - "token_name": "Wrapped Ether", - "token_symbol": "WETH" - }, - { - "token_address": "0x6320cd32aa674d2898a68ec82e869385fc5f7e2f", - "token_name": "Wrapped liquid staked Ether 2.0", - "token_symbol": "wstETH" - }, - { - "token_address": "0x178e141a0e3b34152f73ff610437a7bf9b83267a", - "token_name": "Rocket Pool ETH", - "token_symbol": "rETH" - }, - { - "token_address": "0x", - "token_name": "Test Staked Ether", - "token_symbol": "tsETH" - } - ], - "strategyManager": { - "init_paused_status": 0, - "init_withdrawal_delay_blocks": 10 - }, - "eigenPod": { - "PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS": 50400, - "REQUIRED_BALANCE_WEI": "31000000000000000000" - }, - "eigenPodManager": { - "init_paused_status": 30 - }, - "delayedWithdrawalRouter": { - "init_paused_status": 0, - "init_withdrawal_delay_blocks": 10 - }, - "slasher": { - "init_paused_status": "115792089237316195423570985008687907853269984665640564039457584007913129639935" - }, - "delegation": { - "init_paused_status": "115792089237316195423570985008687907853269984665640564039457584007913129639935" - }, - "ethPOSDepositAddress": "0xff50ed3d0ec03ac01d4c79aad74928bff48a7b2b" -} - diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index 06e438efb..76b0fc3dd 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -7,7 +7,6 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; -import "../../../src/contracts/interfaces/IBeaconChainOracle.sol"; import "../../../src/contracts/core/StrategyManager.sol"; import "../../../src/contracts/core/Slasher.sol"; @@ -18,7 +17,6 @@ import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol"; import "../../../src/contracts/pods/EigenPod.sol"; import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; import "../../../src/contracts/permissions/PauserRegistry.sol"; @@ -59,8 +57,6 @@ contract Deployer_M2 is Script, Test { AVSDirectory public avsDirectoryImplementation; EigenPodManager public eigenPodManager; EigenPodManager public eigenPodManagerImplementation; - DelayedWithdrawalRouter public delayedWithdrawalRouter; - DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; UpgradeableBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; StrategyBase public baseStrategyImplementation; @@ -87,11 +83,9 @@ contract Deployer_M2 is Script, Test { uint256 DELEGATION_INIT_PAUSED_STATUS; uint256 DELEGATION_WITHDRAWAL_DELAY_BLOCKS; uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; - uint256 DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS; // one week in blocks -- 50400 uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS; - uint32 DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS; function run(string memory configFileName) external { // read and log the chainID @@ -108,17 +102,10 @@ contract Deployer_M2 is Script, Test { 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"); EIGENPOD_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".eigenPodManager.init_paused_status"); - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS = stdJson.readUint( - config_data, - ".delayedWithdrawalRouter.init_paused_status" - ); STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") ); - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( - stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") - ); MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = uint64( stdJson.readUint(config_data, ".eigenPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR") @@ -172,10 +159,6 @@ contract Deployer_M2 is Script, Test { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - // if on mainnet, use the ETH2 deposit contract address if (chainId == 1) { ethPOSDeposit = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa); @@ -203,8 +186,6 @@ contract Deployer_M2 is Script, Test { slasher, delegation ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); - // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { IStrategy[] memory _strategies; @@ -254,24 +235,11 @@ contract Deployer_M2 is Script, Test { address(eigenPodManagerImplementation), abi.encodeWithSelector( EigenPodManager.initialize.selector, - IBeaconChainOracle(address(0)), executorMultisig, eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS ) ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - executorMultisig, - eigenLayerPauserReg, - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS, - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS - ) - ); - // deploy StrategyBaseTVLLimits contract implementation baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); // create upgradeable proxies that each point to the implementation and initialize them @@ -306,15 +274,13 @@ contract Deployer_M2 is Script, Test { delegationImplementation, strategyManagerImplementation, slasherImplementation, - eigenPodManagerImplementation, - delayedWithdrawalRouterImplementation + eigenPodManagerImplementation ); _verifyContractsPointAtOneAnother( delegation, strategyManager, slasher, - eigenPodManager, - delayedWithdrawalRouter + eigenPodManager ); _verifyImplementationsSetCorrectly(); _verifyInitialOwners(); @@ -357,12 +323,6 @@ contract Deployer_M2 is Script, Test { "eigenPodManagerImplementation", address(eigenPodManagerImplementation) ); - vm.serializeAddress(deployed_addresses, "delayedWithdrawalRouter", address(delayedWithdrawalRouter)); - vm.serializeAddress( - deployed_addresses, - "delayedWithdrawalRouterImplementation", - address(delayedWithdrawalRouterImplementation) - ); vm.serializeAddress(deployed_addresses, "eigenPodBeacon", address(eigenPodBeacon)); vm.serializeAddress(deployed_addresses, "eigenPodImplementation", address(eigenPodImplementation)); vm.serializeAddress(deployed_addresses, "baseStrategyImplementation", address(baseStrategyImplementation)); @@ -394,8 +354,7 @@ contract Deployer_M2 is Script, Test { DelegationManager delegationContract, StrategyManager strategyManagerContract, Slasher /*slasherContract*/, - EigenPodManager eigenPodManagerContract, - DelayedWithdrawalRouter delayedWithdrawalRouterContract + EigenPodManager eigenPodManagerContract ) internal view { require(delegationContract.slasher() == slasher, "delegation: slasher address not set correctly"); require( @@ -433,11 +392,6 @@ contract Deployer_M2 is Script, Test { eigenPodManagerContract.slasher() == slasher, "eigenPodManager: slasher contract address not set correctly" ); - - require( - delayedWithdrawalRouterContract.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouterContract: eigenPodManager address not set correctly" - ); } function _verifyImplementationsSetCorrectly() internal view { @@ -463,12 +417,6 @@ contract Deployer_M2 is Script, Test { ) == address(eigenPodManagerImplementation), "eigenPodManager: implementation set incorrectly" ); - require( - eigenLayerProxyAdmin.getProxyImplementation( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))) - ) == address(delayedWithdrawalRouterImplementation), - "delayedWithdrawalRouter: implementation set incorrectly" - ); for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { require( @@ -494,10 +442,6 @@ contract Deployer_M2 is Script, Test { require(eigenLayerProxyAdmin.owner() == executorMultisig, "eigenLayerProxyAdmin: owner not set correctly"); require(eigenPodBeacon.owner() == executorMultisig, "eigenPodBeacon: owner not set correctly"); - require( - delayedWithdrawalRouter.owner() == executorMultisig, - "delayedWithdrawalRouter: owner not set correctly" - ); } function _checkPauserInitializations() internal view { @@ -512,10 +456,6 @@ contract Deployer_M2 is Script, Test { eigenPodManager.pauserRegistry() == eigenLayerPauserReg, "eigenPodManager: pauser registry not set correctly" ); - require( - delayedWithdrawalRouter.pauserRegistry() == eigenLayerPauserReg, - "delayedWithdrawalRouter: pauser registry not set correctly" - ); require(eigenLayerPauserReg.isPauser(operationsMultisig), "pauserRegistry: operationsMultisig is not pauser"); require(eigenLayerPauserReg.isPauser(executorMultisig), "pauserRegistry: executorMultisig is not pauser"); @@ -542,22 +482,17 @@ contract Deployer_M2 is Script, Test { // // pause *all of the proof-related functionality* (everything that can be paused other than creation of EigenPods) // uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS = (2**1) + (2**2) + (2**3) + (2**4); /* = 30 */ // // pause *nothing* - // uint256 DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS = 0; // require(strategyManager.paused() == 0, "strategyManager: init paused status set incorrectly"); // require(slasher.paused() == type(uint256).max, "slasher: init paused status set incorrectly"); // require(delegation.paused() == type(uint256).max, "delegation: init paused status set incorrectly"); // require(eigenPodManager.paused() == 30, "eigenPodManager: init paused status set incorrectly"); - // require(delayedWithdrawalRouter.paused() == 0, "delayedWithdrawalRouter: init paused status set incorrectly"); } function _verifyInitializationParams() internal { // // one week in blocks -- 50400 // uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; - // uint32 DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; // require(strategyManager.withdrawalDelayBlocks() == 7 days / 12 seconds, // "strategyManager: withdrawalDelayBlocks initialized incorrectly"); - // require(delayedWithdrawalRouter.withdrawalDelayBlocks() == 7 days / 12 seconds, - // "delayedWithdrawalRouter: withdrawalDelayBlocks initialized incorrectly"); // uint256 MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32 ether; require( @@ -565,11 +500,6 @@ contract Deployer_M2 is Script, Test { "strategyManager: strategyWhitelister address not set correctly" ); - require( - delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouter: eigenPodManager set incorrectly" - ); - require( baseStrategyImplementation.strategyManager() == strategyManager, "baseStrategyImplementation: strategyManager set incorrectly" diff --git a/script/deploy/goerli/GoerliUpgrade1.s.sol b/script/deploy/goerli/GoerliUpgrade1.s.sol deleted file mode 100644 index c64eb8e2f..000000000 --- a/script/deploy/goerli/GoerliUpgrade1.s.sol +++ /dev/null @@ -1,88 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; - - -import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; -import "../../../src/contracts/interfaces/IBeaconChainOracle.sol"; - -import "../../../src/contracts/core/StrategyManager.sol"; -import "../../../src/contracts/core/Slasher.sol"; -import "../../../src/contracts/core/DelegationManager.sol"; - -import "../../../src/contracts/strategies/StrategyBase.sol"; - -import "../../../src/contracts/pods/EigenPod.sol"; -import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; - - -import "forge-std/Script.sol"; -import "forge-std/Test.sol"; - -// # To load the variables in the .env file -// source .env - -// # To deploy and verify our contract -// forge script script/misc/DeployStrategy.s.sol:DeployStrategy --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv - -// NOTE: ONLY WORKS ON GOERLI -// CommitHash: eccdfd43bb882d66a68cad8875dde2979e204546 -contract GoerliUpgrade1 is Script, Test { - Vm cheats = Vm(HEVM_ADDRESS); - - string public deploymentOutputPath = string(bytes("script/output/M1_deployment_goerli_2023_3_23.json")); - - // EigenLayer Contract - - - function run() external { - // read and log the chainID - uint256 chainId = block.chainid; - emit log_named_uint("You are deploying on ChainID", chainId); - - string memory config_data = vm.readFile(deploymentOutputPath); - IStrategyManager strategyManager = IStrategyManager(stdJson.readAddress(config_data, ".addresses.strategyManager")); - IDelegationManager delegation = IDelegationManager(stdJson.readAddress(config_data, ".addresses.delegation")); - IEigenPodManager eigenPodManager = IEigenPodManager(stdJson.readAddress(config_data, ".addresses.eigenPodManager")); - // IBeacon eigenPodBeacon = IBeacon(stdJson.readAddress(config_data, ".addresses.eigenPodBeacon")); - ISlasher slasher = ISlasher(stdJson.readAddress(config_data, ".addresses.slasher")); - IDelayedWithdrawalRouter delayedWithdrawalRouter = IDelayedWithdrawalRouter(stdJson.readAddress(config_data, ".addresses.delayedWithdrawalRouter")); - - vm.startBroadcast(); - - address strategyManagerImplementation = address( - new StrategyManager( - delegation, - eigenPodManager, - slasher - ) - ); - - address slasherImplementation = address( - new Slasher( - strategyManager, - delegation - ) - ); - - address eigenPodImplementation = address( - new EigenPod( - IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), - eigenPodManager, - 1616508000 - ) - ); - - vm.stopBroadcast(); - - emit log_named_address("StrategyManagerImplementation", strategyManagerImplementation); - emit log_named_address("SlasherImplementation", slasherImplementation); - emit log_named_address("EigenPodImplementation", eigenPodImplementation); - - // StrategyManagerImplementation: 0x1b8a566357c21b8b7b7c738a6963e2374718ea94 - // SlasherImplementation: 0x2f82092969d156da92f0b787525042735fc4774a - // EigenPodImplementation: 0x4dd49853a27e3d4a0557876fe225ffce9b6b5d7a - } -} diff --git a/script/deploy/goerli/GoerliUpgrade2.s.sol b/script/deploy/goerli/GoerliUpgrade2.s.sol deleted file mode 100644 index b64af6efb..000000000 --- a/script/deploy/goerli/GoerliUpgrade2.s.sol +++ /dev/null @@ -1,127 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; - -import "../../../src/contracts/core/StrategyManager.sol"; -import "../../../src/contracts/core/Slasher.sol"; -import "../../../src/contracts/core/DelegationManager.sol"; -import "../../../src/contracts/core/AVSDirectory.sol"; - -import "../../../src/contracts/pods/EigenPod.sol"; -import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; - -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "../../../src/test/mocks/EmptyContract.sol"; -import "forge-std/Script.sol"; -import "forge-std/Test.sol"; - -// # To load the variables in the .env file -// source .env - -// # To deploy and verify our contract -// forge script script/upgrade/GoerliUpgrade2.s.sol:GoerliUpgrade2 --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv - -// NOTE: ONLY WORKS ON GOERLI -// CommitHash: 6de01c6c16d6df44af15f0b06809dc160eac0ebf -contract GoerliUpgrade2 is Script, Test { - Vm cheats = Vm(HEVM_ADDRESS); - - string public deploymentOutputPath = string(bytes("script/output/M1_deployment_goerli_2023_3_23.json")); - - IDelayedWithdrawalRouter delayedWithdrawalRouter; - IDelegationManager delegation; - IEigenPodManager eigenPodManager; - IStrategyManager strategyManager; - ISlasher slasher; - IBeacon eigenPodBeacon; - EmptyContract emptyContract; - ProxyAdmin eigenLayerProxyAdmin; - - function run() external { - // read and log the chainID - uint256 chainId = block.chainid; - emit log_named_uint("You are deploying on ChainID", chainId); - - string memory config_data = vm.readFile(deploymentOutputPath); - - delayedWithdrawalRouter = IDelayedWithdrawalRouter(stdJson.readAddress(config_data, ".addresses.delayedWithdrawalRouter")); - delegation = IDelegationManager(stdJson.readAddress(config_data, ".addresses.delegation")); - eigenPodManager = IEigenPodManager(stdJson.readAddress(config_data, ".addresses.eigenPodManager")); - strategyManager = IStrategyManager(stdJson.readAddress(config_data, ".addresses.strategyManager")); - slasher = ISlasher(stdJson.readAddress(config_data, ".addresses.slasher")); - eigenPodBeacon = IBeacon(stdJson.readAddress(config_data, ".addresses.eigenPodBeacon")); - emptyContract = EmptyContract(stdJson.readAddress(config_data, ".addresses.emptyContract")); - eigenLayerProxyAdmin = ProxyAdmin(stdJson.readAddress(config_data, ".addresses.eigenLayerProxyAdmin")); - - vm.startBroadcast(); - - address delegationImplementation = address( - new DelegationManager( - strategyManager, - slasher, - eigenPodManager - ) - ); - - address slasherImplementation = address( - new Slasher( - strategyManager, - delegation - ) - ); - - address strategyManagerImplementation = address( - new StrategyManager( - delegation, - eigenPodManager, - slasher - ) - ); - - address delayedWithdrawalRouterImplementation = address( - new DelayedWithdrawalRouter( - eigenPodManager - ) - ); - - address eigenPodImplementation = address( - new EigenPod( - IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), - eigenPodManager, - 1616508000 - ) - ); - - address eigenPodManagerImplementation = address( - new EigenPodManager( - IETHPOSDeposit(0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b), - eigenPodBeacon, - strategyManager, - slasher, - delegation - ) - ); - - vm.stopBroadcast(); - - emit log_named_address("DelegationImplementation", delegationImplementation); - emit log_named_address("SlasherImplementation", slasherImplementation); - emit log_named_address("StrategyManagerImplementation", strategyManagerImplementation); - emit log_named_address("DelayedWithdrawalRouterImplementation", delayedWithdrawalRouterImplementation); - emit log_named_address("EigenPodImplementation", eigenPodImplementation); - emit log_named_address("EigenPodManagerImplementation", eigenPodManagerImplementation); - - /* - == Logs == - You are deploying on ChainID: 5 - DelegationImplementation: 0x56652542926444Ebce46Fd97aFd80824ed51e58C - SlasherImplementation: 0x89C5e6e98f79be658e830Ec66b61ED3EE910D262 - StrategyManagerImplementation: 0x506C21f43e81D9d231d8A13831b42A2a2B5540E4 - DelayedWithdrawalRouterImplementation: 0xE576731194EC3d8Ba92E7c2B578ea74238772878 - EigenPodImplementation: 0x16a0d8aD2A2b12f3f47d0e8F5929F9840e29a426 - EigenPodManagerImplementation: 0xDA9B60D3dC7adD40C0e35c628561Ff71C13a189f - */ - } -} diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index dc7349a3b..169713531 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -67,10 +67,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - // Deploy EigenPod Contracts eigenPodImplementation = new EigenPod( IETHPOSDeposit(ETHPOSDepositAddress), @@ -90,7 +86,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { slasher, delegationManager ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); // Third, upgrade the proxy contracts to point to the implementations IStrategy[] memory initializeStrategiesToSetDelayBlocks = new IStrategy[](0); @@ -154,18 +149,6 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { EIGENPOD_MANAGER_INIT_PAUSED_STATUS ) ); - // Delayed Withdrawal Router - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - executorMultisig, // initialOwner - eigenLayerPauserReg, - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS, - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS - ) - ); // Deploy Strategies baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); diff --git a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol index f46bc2e88..774e85dc8 100644 --- a/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol +++ b/script/deploy/mainnet/EigenPod_Minor_Upgrade_Deploy.s.sol @@ -7,7 +7,6 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; -import "../../../src/contracts/interfaces/IBeaconChainOracle.sol"; import "../../../src/contracts/core/StrategyManager.sol"; import "../../../src/contracts/core/Slasher.sol"; @@ -15,7 +14,6 @@ import "../../../src/contracts/core/DelegationManager.sol"; import "../../../src/contracts/pods/EigenPod.sol"; import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; import "../../../src/contracts/permissions/PauserRegistry.sol"; @@ -41,16 +39,14 @@ contract EigenPod_Minor_Upgrade_Deploy is Script, Test { StrategyManager public strategyManagerImplementation; IEigenPodManager public eigenPodManager; EigenPodManager public eigenPodManagerImplementation; - IDelayedWithdrawalRouter public delayedWithdrawalRouter; IBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; // Eigenlayer Proxy Admin ProxyAdmin public eigenLayerProxyAdmin; - // BeaconChain deposit contract & beacon chain oracle + // BeaconChain deposit contract IETHPOSDeposit public ethPOS; - address public beaconChainOracle; // RPC url to fork from for pre-upgrade state change tests string public rpcUrl; diff --git a/script/deploy/mainnet/M1_Deploy.s.sol b/script/deploy/mainnet/M1_Deploy.s.sol index dea4f9781..d765774a6 100644 --- a/script/deploy/mainnet/M1_Deploy.s.sol +++ b/script/deploy/mainnet/M1_Deploy.s.sol @@ -7,7 +7,6 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; -import "../../../src/contracts/interfaces/IBeaconChainOracle.sol"; import "../../../src/contracts/core/StrategyManager.sol"; import "../../../src/contracts/core/Slasher.sol"; @@ -17,7 +16,6 @@ import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol"; import "../../../src/contracts/pods/EigenPod.sol"; import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; import "../../../src/contracts/permissions/PauserRegistry.sol"; @@ -56,8 +54,6 @@ contract Deployer_M1 is Script, Test { StrategyManager public strategyManagerImplementation; EigenPodManager public eigenPodManager; EigenPodManager public eigenPodManagerImplementation; - DelayedWithdrawalRouter public delayedWithdrawalRouter; - DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; UpgradeableBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; StrategyBase public baseStrategyImplementation; @@ -85,11 +81,9 @@ contract Deployer_M1 is Script, Test { uint256 DELEGATION_INIT_PAUSED_STATUS; uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; uint256 EIGENPOD_MANAGER_MAX_PODS; - uint256 DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS; // one week in blocks -- 50400 uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS; - uint32 DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS; function run() external { // read and log the chainID @@ -105,17 +99,10 @@ contract Deployer_M1 is Script, Test { DELEGATION_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".delegation.init_paused_status"); EIGENPOD_MANAGER_MAX_PODS = stdJson.readUint(config_data, ".eigenPodManager.max_pods"); EIGENPOD_MANAGER_INIT_PAUSED_STATUS = stdJson.readUint(config_data, ".eigenPodManager.init_paused_status"); - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS = stdJson.readUint( - config_data, - ".delayedWithdrawalRouter.init_paused_status" - ); STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") ); - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( - stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") - ); REQUIRED_BALANCE_WEI = stdJson.readUint(config_data, ".eigenPod.REQUIRED_BALANCE_WEI"); MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = stdJson.readUint( @@ -168,9 +155,6 @@ contract Deployer_M1 is Script, Test { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); // if on mainnet, use the ETH2 deposit contract address if (chainId == 1) { @@ -198,7 +182,6 @@ contract Deployer_M1 is Script, Test { slasher, delegation ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. eigenLayerProxyAdmin.upgradeAndCall( @@ -242,17 +225,6 @@ contract Deployer_M1 is Script, Test { EIGENPOD_MANAGER_INIT_PAUSED_STATUS ) ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - executorMultisig, - eigenLayerPauserReg, - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS, - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS - ) - ); // deploy StrategyBaseTVLLimits contract implementation baseStrategyImplementation = new StrategyBaseTVLLimits(strategyManager); @@ -288,15 +260,13 @@ contract Deployer_M1 is Script, Test { delegationImplementation, strategyManagerImplementation, slasherImplementation, - eigenPodManagerImplementation, - delayedWithdrawalRouterImplementation + eigenPodManagerImplementation ); _verifyContractsPointAtOneAnother( delegation, strategyManager, slasher, - eigenPodManager, - delayedWithdrawalRouter + eigenPodManager ); _verifyImplementationsSetCorrectly(); _verifyInitialOwners(); @@ -335,12 +305,6 @@ contract Deployer_M1 is Script, Test { "eigenPodManagerImplementation", address(eigenPodManagerImplementation) ); - vm.serializeAddress(deployed_addresses, "delayedWithdrawalRouter", address(delayedWithdrawalRouter)); - vm.serializeAddress( - deployed_addresses, - "delayedWithdrawalRouterImplementation", - address(delayedWithdrawalRouterImplementation) - ); vm.serializeAddress(deployed_addresses, "eigenPodBeacon", address(eigenPodBeacon)); vm.serializeAddress(deployed_addresses, "eigenPodImplementation", address(eigenPodImplementation)); vm.serializeAddress(deployed_addresses, "baseStrategyImplementation", address(baseStrategyImplementation)); @@ -370,8 +334,7 @@ contract Deployer_M1 is Script, Test { DelegationManager delegationContract, StrategyManager strategyManagerContract, Slasher slasherContract, - EigenPodManager eigenPodManagerContract, - DelayedWithdrawalRouter delayedWithdrawalRouterContract + EigenPodManager eigenPodManagerContract ) internal view { require(delegationContract.slasher() == slasher, "delegation: slasher address not set correctly"); require( @@ -408,11 +371,6 @@ contract Deployer_M1 is Script, Test { eigenPodManagerContract.slasher() == slasher, "eigenPodManager: slasher contract address not set correctly" ); - - require( - delayedWithdrawalRouterContract.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouterContract: eigenPodManager address not set correctly" - ); } function _verifyImplementationsSetCorrectly() internal view { @@ -438,12 +396,6 @@ contract Deployer_M1 is Script, Test { ) == address(eigenPodManagerImplementation), "eigenPodManager: implementation set incorrectly" ); - require( - eigenLayerProxyAdmin.getProxyImplementation( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))) - ) == address(delayedWithdrawalRouterImplementation), - "delayedWithdrawalRouter: implementation set incorrectly" - ); for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { require( @@ -468,10 +420,6 @@ contract Deployer_M1 is Script, Test { require(eigenLayerProxyAdmin.owner() == executorMultisig, "eigenLayerProxyAdmin: owner not set correctly"); require(eigenPodBeacon.owner() == executorMultisig, "eigenPodBeacon: owner not set correctly"); - require( - delayedWithdrawalRouter.owner() == executorMultisig, - "delayedWithdrawalRouter: owner not set correctly" - ); } function _checkPauserInitializations() internal view { @@ -485,10 +433,6 @@ contract Deployer_M1 is Script, Test { eigenPodManager.pauserRegistry() == eigenLayerPauserReg, "eigenPodManager: pauser registry not set correctly" ); - require( - delayedWithdrawalRouter.pauserRegistry() == eigenLayerPauserReg, - "delayedWithdrawalRouter: pauser registry not set correctly" - ); require(eigenLayerPauserReg.isPauser(operationsMultisig), "pauserRegistry: operationsMultisig is not pauser"); require(eigenLayerPauserReg.isPauser(executorMultisig), "pauserRegistry: executorMultisig is not pauser"); @@ -515,22 +459,17 @@ contract Deployer_M1 is Script, Test { // // pause *all of the proof-related functionality* (everything that can be paused other than creation of EigenPods) // uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS = (2**1) + (2**2) + (2**3) + (2**4); /* = 30 */ // // pause *nothing* - // uint256 DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS = 0; require(strategyManager.paused() == 0, "strategyManager: init paused status set incorrectly"); require(slasher.paused() == type(uint256).max, "slasher: init paused status set incorrectly"); require(delegation.paused() == type(uint256).max, "delegation: init paused status set incorrectly"); require(eigenPodManager.paused() == 30, "eigenPodManager: init paused status set incorrectly"); - require(delayedWithdrawalRouter.paused() == 0, "delayedWithdrawalRouter: init paused status set incorrectly"); } function _verifyInitializationParams() internal { // // one week in blocks -- 50400 // uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; - // uint32 DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; // require(strategyManager.withdrawalDelayBlocks() == 7 days / 12 seconds, // "strategyManager: withdrawalDelayBlocks initialized incorrectly"); - // require(delayedWithdrawalRouter.withdrawalDelayBlocks() == 7 days / 12 seconds, - // "delayedWithdrawalRouter: withdrawalDelayBlocks initialized incorrectly"); // uint256 REQUIRED_BALANCE_WEI = 32 ether; require( @@ -538,11 +477,6 @@ contract Deployer_M1 is Script, Test { "strategyManager: strategyWhitelister address not set correctly" ); - require( - delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouter: eigenPodManager set incorrectly" - ); - require( baseStrategyImplementation.strategyManager() == strategyManager, "baseStrategyImplementation: strategyManager set incorrectly" diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index 4558f2bda..adba3e565 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -7,7 +7,6 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; -import "../../../src/contracts/interfaces/IBeaconChainOracle.sol"; import "../../../src/contracts/core/StrategyManager.sol"; import "../../../src/contracts/core/Slasher.sol"; @@ -15,7 +14,6 @@ import "../../../src/contracts/core/DelegationManager.sol"; import "../../../src/contracts/pods/EigenPod.sol"; import "../../../src/contracts/pods/EigenPodManager.sol"; -import "../../../src/contracts/pods/DelayedWithdrawalRouter.sol"; import "../../../src/contracts/permissions/PauserRegistry.sol"; @@ -41,16 +39,14 @@ contract M2Deploy is Script, Test { StrategyManager public strategyManagerImplementation; IEigenPodManager public eigenPodManager; EigenPodManager public eigenPodManagerImplementation; - IDelayedWithdrawalRouter public delayedWithdrawalRouter; IBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; // Eigenlayer Proxy Admin ProxyAdmin public eigenLayerProxyAdmin; - // BeaconChain deposit contract & beacon chain oracle + // BeaconChain deposit contract IETHPOSDeposit public ethPOS; - address public beaconChainOracle; // RPC url to fork from for pre-upgrade state change tests string public rpcUrl; @@ -95,9 +91,6 @@ contract M2Deploy is Script, Test { revert("Chain not supported"); } - // Set beacon chain oracle, currently 0 address - beaconChainOracle = 0x0000000000000000000000000000000000000000; - // Read json data string memory deployment_data = vm.readFile(m1DeploymentOutputPath); slasher = Slasher(stdJson.readAddress(deployment_data, ".addresses.slasher")); @@ -172,7 +165,6 @@ contract M2Deploy is Script, Test { vm.serializeAddress(deployed_addresses, "slasher", address(slasher)); vm.serializeAddress(deployed_addresses, "delegation", address(delegation)); vm.serializeAddress(deployed_addresses, "strategyManager", address(strategyManager)); - vm.serializeAddress(deployed_addresses, "delayedWithdrawalRouter", address(delayedWithdrawalRouter)); vm.serializeAddress(deployed_addresses, "eigenPodManager", address(eigenPodManager)); vm.serializeAddress(deployed_addresses, "eigenPodBeacon", address(eigenPodBeacon)); vm.serializeAddress(deployed_addresses, "ethPOS", address(ethPOS)); @@ -244,7 +236,7 @@ contract M2Deploy is Script, Test { // Call contracts to ensure that all simple view functions return the same values (e.g. the return value of `StrategyManager.delegation()` hasn’t changed) // StrategyManager: delegation, eigenPodManager, slasher, strategyWhitelister, withdrawalDelayBlocks all unchanged // DelegationManager: DOMAIN_SEPARATOR, strategyManager, slasher, eigenPodManager all unchanged - // EigenPodManager: ethPOS, eigenPodBeacon, strategyManager, slasher, beaconChainOracle, numPods all unchanged + // EigenPodManager: ethPOS, eigenPodBeacon, strategyManager, slasher, numPods all unchanged // delegationManager is now correct (added immutable) // Call contracts to make sure they are still “initialized” (ensure that trying to call initializer reverts) function _verifyStorageSlots() internal view { @@ -322,10 +314,6 @@ contract M2Deploy is Script, Test { cheats.prank(IPauserRegistry(IPausable(address(eigenPodManager)).pauserRegistry()).unpauser()); IPausable(address(eigenPodManager)).unpause(paused ^ (1 << 2)); // eigenpods verify credentials on 2nd bit - // Get values to check post activating restaking - uint256 podBalanceBefore = address(eigenPod).balance; - uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(eigenPodDepositor); - // Activate restaking and expect emit cheats.prank(eigenPodOwner); cheats.expectEmit(true, true, true, true); @@ -334,17 +322,6 @@ contract M2Deploy is Script, Test { // Check updated storage values require(eigenPod.hasRestaked(), "eigenPod.hasRestaked not set to true"); - require(address(eigenPod).balance == 0, "eigenPod balance not 0 after activating restaking"); - - // Check that delayed withdrawal has been created - require( - delayedWithdrawalRouter.userWithdrawalsLength(eigenPodDepositor) == userWithdrawalsLength + 1, - "delayedWithdrawalRouter.userWithdrawalsLength not incremented" - ); - IDelayedWithdrawalRouter.DelayedWithdrawal memory delayedWithdrawal = delayedWithdrawalRouter - .userDelayedWithdrawalByIndex(eigenPodDepositor, userWithdrawalsLength); - require(delayedWithdrawal.amount == podBalanceBefore, "delayedWithdrawal.amount incorrect"); - require(delayedWithdrawal.blockCreated == block.number, "delayedWithdrawal.blockCreated incorrect"); } // Existing LST depositor – ensure that strategy length and shares are all identical @@ -361,7 +338,7 @@ contract M2Deploy is Script, Test { // Sends all funds in EigenPod (need to make sure it has nonzero balance beforehand) // Sets `hasRestaked` to ‘true’ // Emits a ‘RestakingActivated’ event - // EigenPod: ethPOS, delayedWithdrawalRouter, eigenPodManager + // EigenPod: ethPOS, eigenPodManager event RestakingActivated(address indexed podOwner); } diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index b0737be5b..13a53bf5c 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -77,7 +77,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { slasher, delegationManager ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); } function _simulateUpgrade() internal { @@ -110,11 +109,6 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { TransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation) ); - // Delayed Withdrawal Router - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation) - ); // Second, configure additional settings and paused statuses delegationManager.setMinWithdrawalDelayBlocks(DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS); @@ -170,15 +164,15 @@ contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { ) ); - txs[3] = Tx( - address(eigenLayerProxyAdmin), - 0, - abi.encodeWithSelector( - ProxyAdmin.upgrade.selector, - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - delayedWithdrawalRouterImplementation - ) - ); + // txs[3] = Tx( + // address(eigenLayerProxyAdmin), + // 0, + // abi.encodeWithSelector( + // ProxyAdmin.upgrade.selector, + // TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), + // delayedWithdrawalRouterImplementation + // ) + // ); txs[4] = Tx( address(eigenLayerProxyAdmin), diff --git a/script/output/devnet/M2_from_scratch_deployment_data.json b/script/output/devnet/M2_from_scratch_deployment_data.json index 693ddc287..dd4b84cd1 100644 --- a/script/output/devnet/M2_from_scratch_deployment_data.json +++ b/script/output/devnet/M2_from_scratch_deployment_data.json @@ -1,34 +1,29 @@ { "addresses": { - "baseStrategyImplementation": "0x5207CfA0166E8de0FCdFd78B4d17b68587bE306d", - "blsPublicKeyCompendium": "0x970670459734a83899773A0fd45941B5afC1200e", - "delayedWithdrawalRouter": "0xD718d5A27a29FF1cD22403426084bA0d479869a0", - "delayedWithdrawalRouterImplementation": "0x1c23A6d89F95ef3148BCDA8E242cAb145bf9c0E4", - "delegation": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76", - "delegationImplementation": "0xd21060559c9beb54fC07aFd6151aDf6cFCDDCAeB", - "eigenLayerPauserReg": "0xA8452Ec99ce0C64f20701dB7dD3abDb607c00496", - "eigenLayerProxyAdmin": "0x90193C961A926261B756D1E5bb255e67ff9498A1", - "eigenPodBeacon": "0x416C42991d05b31E9A6dC209e91AD22b79D87Ae6", - "eigenPodImplementation": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", - "eigenPodManager": "0xDEb1E9a6Be7Baf84208BB6E10aC9F9bbE1D70809", - "eigenPodManagerImplementation": "0x8B71b41D4dBEb2b6821d44692d3fACAAf77480Bb", - "emptyContract": "0xBb2180ebd78ce97360503434eD37fcf4a1Df61c3", - "slasher": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", - "slasherImplementation": "0x978e3286EB805934215a88694d80b09aDed68D90", - "strategies": { - "Coinbase Wrapped Staked ETH": "0x39Af23E00F1e662025aA01b0cEdA19542B78DF99", - "Liquid staked Ether 2.0": "0xEF179756ea6525AFade217cA5aB0b1b5CfE0fd92", - "Rocket Pool ETH": "0xd6EAF4c146261653EE059077B78ED088Add54309" - }, - "strategyManager": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", - "strategyManagerImplementation": "0x4C52a6277b1B84121b3072C0c92b6Be0b7CC10F1" + "avsDirectory": "0x8E45C0936fa1a65bDaD3222bEFeC6a03C83372cE", + "avsDirectoryImplementation": "0xd30bF3219A0416602bE8D482E0396eF332b0494E", + "baseStrategyImplementation": "0xeC827421505972a2AE9C320302d3573B42363C26", + "delegation": "0x627b9A657eac8c3463AD17009a424dFE3FDbd0b1", + "delegationImplementation": "0xd753c12650c280383Ce873Cc3a898F6f53973d16", + "eigenLayerPauserReg": "0x4eaB29997D332A666c3C366217Ab177cF9A7C436", + "eigenLayerProxyAdmin": "0x325c8Df4CFb5B068675AFF8f62aA668D1dEc3C4B", + "eigenPodBeacon": "0x10e38eE9dd4C549b61400Fc19347D00eD3edAfC4", + "eigenPodImplementation": "0x262e2b50219620226C5fB5956432A88fffd94Ba7", + "eigenPodManager": "0xC32609C91d6B6b51D48f2611308FEf121B02041f", + "eigenPodManagerImplementation": "0xAD2935E147b61175D5dc3A9e7bDa93B0975A43BA", + "emptyContract": "0x5Ffe31E4676D3466268e28a75E51d1eFa4298620", + "slasher": "0xBEe6FFc1E8627F51CcDF0b4399a1e1abc5165f15", + "slasherImplementation": "0x06b3244b086cecC40F1e5A826f736Ded68068a0F", + "strategies": "", + "strategyManager": "0xa62835D1A6bf5f521C4e2746E1F51c923b8f3483", + "strategyManagerImplementation": "0xd710a67624Ad831683C86a48291c597adE30F787" }, "chainInfo": { - "chainId": 31337, - "deploymentBlock": 1 + "chainId": 17000, + "deploymentBlock": 1775013 }, "parameters": { - "executorMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90", - "operationsMultisig": "0xBE1685C81aA44FF9FB319dD389addd9374383e90" + "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" } } \ No newline at end of file diff --git a/script/output/goerli/GV2_deployment_2024_6_2.json b/script/output/goerli/GV2_deployment_2024_6_2.json deleted file mode 100644 index e68db2428..000000000 --- a/script/output/goerli/GV2_deployment_2024_6_2.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "addresses": { - "baseStrategyImplementation": "0x81E94e16949AC397d508B5C2557a272faD2F8ebA", - "delayedWithdrawalRouter": "0x89581561f1F98584F88b0d57c2180fb89225388f", - "delayedWithdrawalRouterImplementation": "0xE576731194EC3d8Ba92E7c2B578ea74238772878", - "delegation": "0x1b7b8F6b258f95Cf9596EabB9aa18B62940Eb0a8", - "delegationImplementation": "0x56652542926444Ebce46Fd97aFd80824ed51e58C", - "eigenLayerPauserReg": "0x7cB9c5D6b9702f2f680e4d35cb1fC945D08208F6", - "eigenLayerProxyAdmin": "0x28ceac2ff82B2E00166e46636e2A4818C29902e2", - "eigenPodBeacon": "0x3093F3B560352F896F0e9567019902C9Aff8C9a5", - "eigenPodImplementation": "0x16a0d8aD2A2b12f3f47d0e8F5929F9840e29a426", - "eigenPodManager": "0xa286b84C96aF280a49Fe1F40B9627C2A2827df41", - "eigenPodManagerImplementation": "0xDA9B60D3dC7adD40C0e35c628561Ff71C13a189f", - "emptyContract": "0xa04bf5170D86833294b5c21c712C69C0Fb5735A4", - "slasher": "0xD11d60b669Ecf7bE10329726043B3ac07B380C22", - "slasherImplementation": "0x89C5e6e98f79be658e830Ec66b61ED3EE910D262", - "strategyManager": "0x779d1b5315df083e3F9E94cB495983500bA8E907", - "strategyManagerImplementation": "0x506C21f43e81D9d231d8A13831b42A2a2B5540E4", - "avsDirectory": "0x0AC9694c271eFbA6059e9783769e515E8731f935", - "avsDirectoryImplementation": "0x871cD8f6CFec8b2EB1ac64d58F6D9e1D36a88cb3" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 10497389 - }, - "parameters": { - "executorMultisig": "0x3d9C2c2B40d890ad53E27947402e977155CD2808", - "operationsMultisig": "0x040353E9d057689b77DF275c07FFe1A46b98a4a6" - } -} \ No newline at end of file diff --git a/script/output/goerli/GV2_preprod_deployment_2024_30_1.json b/script/output/goerli/GV2_preprod_deployment_2024_30_1.json deleted file mode 100644 index f705e6f9f..000000000 --- a/script/output/goerli/GV2_preprod_deployment_2024_30_1.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "addresses": { - "baseStrategyImplementation": "0xA548BF0106108A0c14779F3f1d8981517b8fA9D0", - "delayedWithdrawalRouter": "0x9572e46797B7A07257314e587061dC46c4dfCE0E", - "delayedWithdrawalRouterImplementation": "0x44a40C60857b4B420Ad3D8b9646FefEBF2D0dB86", - "delegation": "0x45b4c4DAE69393f62e1d14C5fe375792DF4E6332", - "delegationImplementation": "0x934eB3E2b6D5C2E1601B29B7180026D71438F20D", - "eigenLayerPauserReg": "0x94A2679B6A87ADb4e0CabA8E3E40f463C6062DeC", - "eigenLayerProxyAdmin": "0x555573Ff2B3b2731e69eeBAfb40a4EEA7fBaC54A", - "eigenPodBeacon": "0x38cBD4e08eA1840B91dA42fE02B55Abc89083bFB", - "eigenPodImplementation": "0x83cbB48391F428878Bc5DD97C9792a8dbCAa0729", - "eigenPodManager": "0x33e42d539abFe9b387B27b0e467374Bbb76cf925", - "eigenPodManagerImplementation": "0xEEdCC9dB001fB8429721FE21426F51f0Cdd329EC", - "emptyContract": "0xb23633b2240D78502fA308B817C892b2d5778469", - "slasher": "0xF751E8C37ACd3AD5a35D5db03E57dB6F9AD0bDd0", - "slasherImplementation": "0x05c235183e8b9dFb7113Cf92bbDc3f5085324158", - "strategyManager": "0xD309ADd2B269d522112DcEe0dCf0b0f04a09C29e", - "strategyManagerImplementation": "0xb9B69504f1a727E783F4B4248A115D56F4080DF8", - "avsDirectory": "0x47eFB8e38656a805BC6B3b13FA331d34dcDeB374", - "avsDirectoryImplementation": "0x728111B10227F44E5e389e5650725948d1DCcE7A" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 10469472 - }, - "parameters": { - "executorMultisig": "0x27977e6E4426A525d055A587d2a0537b4cb376eA", - "operationsMultisig": "0x27977e6E4426A525d055A587d2a0537b4cb376eA" - } -} \ No newline at end of file diff --git a/script/output/goerli/M1_deployment_goerli_2023_3_23.json b/script/output/goerli/M1_deployment_goerli_2023_3_23.json deleted file mode 100644 index 11d0d1184..000000000 --- a/script/output/goerli/M1_deployment_goerli_2023_3_23.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "addresses": { - "baseStrategyImplementation": "0x2c836f44207A732bC951df98f0cAcE4704432B7E", - "delayedWithdrawalRouter": "0x89581561f1F98584F88b0d57c2180fb89225388f", - "delayedWithdrawalRouterImplementation": "0x6854c0eF4A8dF70a5E832cC3b3b4C5a500063837", - "delegation": "0x1b7b8F6b258f95Cf9596EabB9aa18B62940Eb0a8", - "delegationImplementation": "0xeBea7B291b6631806244Ed0E3d1E585e76BB37fb", - "eigenLayerPauserReg": "0x7cB9c5D6b9702f2f680e4d35cb1fC945D08208F6", - "eigenLayerProxyAdmin": "0x28ceac2ff82B2E00166e46636e2A4818C29902e2", - "eigenPodBeacon": "0x3093F3B560352F896F0e9567019902C9Aff8C9a5", - "eigenPodImplementation": "0x0062645382Af44593bA2E453F51604833277F371", - "eigenPodManager": "0xa286b84C96aF280a49Fe1F40B9627C2A2827df41", - "eigenPodManagerImplementation": "0xad46772384CFec11d140E255e6d240949A194f17", - "emptyContract": "0xa04bf5170D86833294b5c21c712C69C0Fb5735A4", - "slasher": "0xD11d60b669Ecf7bE10329726043B3ac07B380C22", - "slasherImplementation": "0x7dcbcb83f7e744ffa1a94f508419cee8279f469e", - "strategies": { - "WETH": "0x7CA911E83dabf90C90dD3De5411a10F1A6112184", - "rETH": "0x879944A8cB437a5f8061361f82A6d4EED59070b5", - "tsETH": "0xcFA9da720682bC4BCb55116675f16F503093ba13", - "wstETH": "0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff", - "stETH": "0xB613E78E2068d7489bb66419fB1cfa11275d14da" - }, - "strategyManager": "0x779d1b5315df083e3F9E94cB495983500bA8E907", - "strategyManagerImplementation": "0xcf19a2e2d1d83994ad9c89807d4173519aef72a0" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 8705851 - }, - "parameters": { - "communityMultisig": "0x37bAFb55BC02056c5fD891DFa503ee84a97d89bF", - "operationsMultisig": "0x040353E9d057689b77DF275c07FFe1A46b98a4a6", - "executorMultisig": "0x3d9C2c2B40d890ad53E27947402e977155CD2808", - "timelock": "0xA7e72a0564ebf25Fa082Fc27020225edeAF1796E" - } -} \ No newline at end of file diff --git a/script/output/goerli/M2_deployment_data_goerli.json b/script/output/goerli/M2_deployment_data_goerli.json deleted file mode 100644 index 45acc38f2..000000000 --- a/script/output/goerli/M2_deployment_data_goerli.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "addresses": { - "delayedWithdrawalRouter": "0x89581561f1F98584F88b0d57c2180fb89225388f", - "delegation": "0x1b7b8F6b258f95Cf9596EabB9aa18B62940Eb0a8", - "delegationImplementation": "0x9b7980a32ceCe2Aa936DD2E43AF74af62581A99d", - "eigenPodBeacon": "0x3093F3B560352F896F0e9567019902C9Aff8C9a5", - "eigenPodImplementation": "0x86bf376E0C0c9c6D332E13422f35Aca75C106CcA", - "eigenPodManager": "0xa286b84C96aF280a49Fe1F40B9627C2A2827df41", - "eigenPodManagerImplementation": "0xdD09d95bD25299EDBF4f33d76F84dBc77b0B901b", - "ethPOS": "0xff50ed3d0ec03aC01D4C79aAd74928BFF48a7b2b", - "slasher": "0xD11d60b669Ecf7bE10329726043B3ac07B380C22", - "strategyManager": "0x779d1b5315df083e3F9E94cB495983500bA8E907", - "strategyManagerImplementation": "0x8676bb5f792ED407a237234Fe422aC6ed3540055" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 10002668 - } -} \ No newline at end of file diff --git a/script/output/goerli/M2_preprod_deployment_from_scratch.json b/script/output/goerli/M2_preprod_deployment_from_scratch.json deleted file mode 100644 index 0ac97a9e9..000000000 --- a/script/output/goerli/M2_preprod_deployment_from_scratch.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "addresses": { - "baseStrategyImplementation": "0xA548BF0106108A0c14779F3f1d8981517b8fA9D0", - "blsPublicKeyCompendium": "0x663F1f6A8E4417b9dB3117821068DAD862395aF0", - "delayedWithdrawalRouter": "0x9572e46797B7A07257314e587061dC46c4dfCE0E", - "delayedWithdrawalRouterImplementation": "0xaDd6b52E063bE5CdeF6450F28D9CA038bDAB9A49", - "delegation": "0x45b4c4DAE69393f62e1d14C5fe375792DF4E6332", - "delegationImplementation": "0x679cf51e303827c99e924bea05331101bF90B126", - "eigenLayerPauserReg": "0x94A2679B6A87ADb4e0CabA8E3E40f463C6062DeC", - "eigenLayerProxyAdmin": "0x555573Ff2B3b2731e69eeBAfb40a4EEA7fBaC54A", - "eigenPodBeacon": "0x38cBD4e08eA1840B91dA42fE02B55Abc89083bFB", - "eigenPodImplementation": "0x9CeE917f0f5d4123585A4B12906a8A65cFac1ac8", - "eigenPodManager": "0x33e42d539abFe9b387B27b0e467374Bbb76cf925", - "eigenPodManagerImplementation": "0x6A4855ab9a3924c8169f20a189272FFF3cd00b68", - "emptyContract": "0xb23633b2240D78502fA308B817C892b2d5778469", - "slasher": "0xF751E8C37ACd3AD5a35D5db03E57dB6F9AD0bDd0", - "slasherImplementation": "0xa02171440AfD8d5f09BaAB74Cd48b1401C47F2f9", - "strategies": { - "Liquid staked Ether 2.0": "0xed6DE3f2916d20Cb427fe7255194a05061319FFB", - "Rocket Pool ETH": "0xd421b2a340497545dA68AE53089d99b9Fe0493cD" - }, - "strategyManager": "0xD309ADd2B269d522112DcEe0dCf0b0f04a09C29e", - "strategyManagerImplementation": "0xC10133A329A210f8DEbf597C8eF5907c95D673e9" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 9729808 - }, - "parameters": { - "executorMultisig": "0x27977e6E4426A525d055A587d2a0537b4cb376eA", - "operationsMultisig": "0x27977e6E4426A525d055A587d2a0537b4cb376eA" - } - } \ No newline at end of file diff --git a/script/output/goerli/deployment_output.json b/script/output/goerli/deployment_output.json deleted file mode 100644 index 9f362dbd1..000000000 --- a/script/output/goerli/deployment_output.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "addresses": { - "ERC20Mock": "0x7ad75e99869026FE521f34d1239AD633463bA520", - "ERC20MockStrategy": "0x3FF9067f06c7833560d2d669fa58D6b1b788EcF0", - "ERC20MockStrategyImplementation": "0xE0411693E86760840B6Ee90004b0C248ab5c9631", - "delayedWithdrawalRouter": "0x91BbcEd2DB7778c569Fbab34A3957f5ded92bb2d", - "delayedWithdrawalRouterImplementation": "0x007F25A938173F0995daB8e7806aC8b6EbfB7808", - "delegation": "0x1b0870C6a7472ED9Da774b4Ca0Fe1b5fd6B6D61E", - "delegationImplementation": "0x9cCb6f6BC4e7641Cd6d5E7BD7e97f55D9914AaAb", - "eigenLayerPauserReg": "0x18E5227d0E8D8053579d5c1eD6bbd7DD55139454", - "eigenLayerProxyAdmin": "0x81048ca94171C7B97ff0fE590eF67f4B442eD548", - "eigenPodBeacon": "0x4BE52ac49121421A9AF33c476f7f6511Fbf4fCc7", - "eigenPodImplementation": "0xeb873028bA8d079768F11C71b05564D1590238A5", - "eigenPodManager": "0x83622B4e84Daadd0AF1382caE2F8Aa2C67839D9e", - "eigenPodManagerImplementation": "0x009030ab40Db41F9D9336DfED1698D8FFeB6a604", - "emptyContract": "0xbeC65eD486c151202EF673A456e6d8e446726Df6", - "slasher": "0x5B617a19d39Ed8c0754fA31Ef86e6c398Ba1a24E", - "slasherImplementation": "0x8122eD67A26D835349438286FBd0A9cbA6841332", - "strategyManager": "0x5d55B8fDC847c1DF56d1dDd8E278424124199EC3", - "strategyManagerImplementation": "0xC69229bf9E6bb82FfB31fA2fdcEF5431b3a81453" - }, - "chainInfo": { - "chainId": 5, - "deploymentBlock": 9548171 - }, - "parameters": { - "alphaMultisig": "0x95C7A3F90e80329C97A6493142Ab7923E15b8083" - } -} \ No newline at end of file diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 80fa773e6..7c4a83e04 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -17,7 +17,6 @@ import "../../src/contracts/strategies/EigenStrategy.sol"; import "../../src/contracts/pods/EigenPod.sol"; import "../../src/contracts/pods/EigenPodManager.sol"; -import "../../src/contracts/pods/DelayedWithdrawalRouter.sol"; import "../../src/contracts/permissions/PauserRegistry.sol"; @@ -57,9 +56,6 @@ contract ExistingDeploymentParser is Script, Test { RewardsCoordinator public rewardsCoordinatorImplementation; EigenPodManager public eigenPodManager; EigenPodManager public eigenPodManagerImplementation; - DelayedWithdrawalRouter public delayedWithdrawalRouter; - DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; - IBeaconChainOracle beaconOracle; UpgradeableBeacon public eigenPodBeacon; EigenPod public eigenPodImplementation; StrategyBase public baseStrategyImplementation; @@ -123,10 +119,6 @@ contract ExistingDeploymentParser is Script, Test { uint64 EIGENPOD_GENESIS_TIME; uint64 EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; address ETHPOSDepositAddress; - uint256 DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS; - - // one week in blocks -- 50400 - uint32 DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS; // Strategy Deployment uint256 STRATEGY_MAX_PER_DEPOSIT; @@ -186,13 +178,6 @@ contract ExistingDeploymentParser is Script, Test { eigenPodManagerImplementation = EigenPodManager( stdJson.readAddress(existingDeploymentData, ".addresses.eigenPodManagerImplementation") ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - stdJson.readAddress(existingDeploymentData, ".addresses.delayedWithdrawalRouter") - ); - delayedWithdrawalRouterImplementation = DelayedWithdrawalRouter( - stdJson.readAddress(existingDeploymentData, ".addresses.delayedWithdrawalRouterImplementation") - ); - beaconOracle = IBeaconChainOracle(stdJson.readAddress(existingDeploymentData, ".addresses.beaconOracle")); eigenPodBeacon = UpgradeableBeacon(stdJson.readAddress(existingDeploymentData, ".addresses.eigenPodBeacon")); eigenPodImplementation = EigenPod( payable(stdJson.readAddress(existingDeploymentData, ".addresses.eigenPodImplementation")) @@ -258,9 +243,6 @@ contract ExistingDeploymentParser is Script, Test { uint256 configChainId = stdJson.readUint(initialDeploymentData, ".chainInfo.chainId"); require(configChainId == currentChainId, "You are on the wrong chain for this config"); - // read beacon oracle - beaconOracle = IBeaconChainOracle(stdJson.readAddress(initialDeploymentData, ".beaconOracleAddress")); - // read all of the deployed addresses executorMultisig = stdJson.readAddress(initialDeploymentData, ".multisig_addresses.executorMultisig"); operationsMultisig = stdJson.readAddress(initialDeploymentData, ".multisig_addresses.operationsMultisig"); @@ -344,16 +326,6 @@ contract ExistingDeploymentParser is Script, Test { stdJson.readUint(initialDeploymentData, ".eigenPod.MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR") ); ETHPOSDepositAddress = stdJson.readAddress(initialDeploymentData, ".ethPOSDepositAddress"); - // DelayedWithdrawalRouter - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS = stdJson.readUint( - initialDeploymentData, - ".delayedWithdrawalRouter.init_paused_status" - ); - - // both set to one week in blocks 50400 - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( - stdJson.readUint(initialDeploymentData, ".delayedWithdrawalRouter.init_withdrawalDelayBlocks") - ); logInitialDeploymentParams(); } @@ -412,11 +384,6 @@ contract ExistingDeploymentParser is Script, Test { eigenPodManager.delegationManager() == delegationManager, "eigenPodManager: delegationManager contract address not set correctly" ); - // DelayedWithdrawalRouter - require( - delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouterContract: eigenPodManager address not set correctly" - ); } /// @notice verify implementations for Transparent Upgradeable Proxies @@ -455,12 +422,6 @@ contract ExistingDeploymentParser is Script, Test { ) == address(eigenPodManagerImplementation), "eigenPodManager: implementation set incorrectly" ); - require( - eigenLayerProxyAdmin.getProxyImplementation( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))) - ) == address(delayedWithdrawalRouterImplementation), - "delayedWithdrawalRouter: implementation set incorrectly" - ); for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { require( @@ -518,14 +479,6 @@ contract ExistingDeploymentParser is Script, Test { eigenLayerPauserReg, EIGENPOD_MANAGER_INIT_PAUSED_STATUS ); - // DelayedWithdrawalRouter - vm.expectRevert(bytes("Initializable: contract is already initialized")); - delayedWithdrawalRouter.initialize( - address(0), - eigenLayerPauserReg, - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS, - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS - ); // Strategies for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { vm.expectRevert(bytes("Initializable: contract is already initialized")); @@ -656,23 +609,6 @@ contract ExistingDeploymentParser is Script, Test { eigenPodImplementation.ethPOS() == IETHPOSDeposit(ETHPOSDepositAddress), "eigenPodImplementation: ethPOS not set correctly" ); - // DelayedWithdrawalRouter - require( - delayedWithdrawalRouter.pauserRegistry() == eigenLayerPauserReg, - "delayedWithdrawalRouter: pauser registry not set correctly" - ); - require( - delayedWithdrawalRouter.owner() == executorMultisig, - "delayedWithdrawalRouter: owner not set correctly" - ); - require( - delayedWithdrawalRouter.paused() == DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS, - "delayedWithdrawalRouter: init paused status set incorrectly" - ); - require( - delayedWithdrawalRouter.withdrawalDelayBlocks() == DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS, - "delayedWithdrawalRouter: withdrawalDelayBlocks not set correctly" - ); // Strategies for (uint256 i = 0; i < deployedStrategyArray.length; ++i) { require( @@ -723,14 +659,6 @@ contract ExistingDeploymentParser is Script, Test { EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR ); emit log_named_address("ETHPOSDepositAddress", ETHPOSDepositAddress); - emit log_named_uint( - "DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS", - DELAYED_WITHDRAWAL_ROUTER_INIT_PAUSED_STATUS - ); - emit log_named_uint( - "DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS", - DELAYED_WITHDRAWAL_ROUTER_INIT_WITHDRAWAL_DELAY_BLOCKS - ); emit log_string("==== Strategies to Deploy ===="); for (uint256 i = 0; i < numStrategiesToDeploy; ++i) { @@ -798,13 +726,6 @@ contract ExistingDeploymentParser is Script, Test { "eigenPodManagerImplementation", address(eigenPodManagerImplementation) ); - vm.serializeAddress(deployed_addresses, "delayedWithdrawalRouter", address(delayedWithdrawalRouter)); - vm.serializeAddress( - deployed_addresses, - "delayedWithdrawalRouterImplementation", - address(delayedWithdrawalRouterImplementation) - ); - vm.serializeAddress(deployed_addresses, "beaconOracle", address(beaconOracle)); vm.serializeAddress(deployed_addresses, "eigenPodBeacon", address(eigenPodBeacon)); vm.serializeAddress(deployed_addresses, "eigenPodImplementation", address(eigenPodImplementation)); vm.serializeAddress(deployed_addresses, "baseStrategyImplementation", address(baseStrategyImplementation)); diff --git a/src/contracts/interfaces/IBeaconChainOracle.sol b/src/contracts/interfaces/IBeaconChainOracle.sol deleted file mode 100644 index 5f1afabdc..000000000 --- a/src/contracts/interfaces/IBeaconChainOracle.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0; - -/** - * @title Interface for the BeaconStateOracle contract. - * @author Layr Labs, Inc. - * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service - */ -interface IBeaconChainOracle { - /// @notice The block number to state root mapping. - function timestampToBlockRoot(uint256 timestamp) external view returns (bytes32); -} diff --git a/src/contracts/interfaces/IDelayedWithdrawalRouter.sol b/src/contracts/interfaces/IDelayedWithdrawalRouter.sol deleted file mode 100644 index 797ac0487..000000000 --- a/src/contracts/interfaces/IDelayedWithdrawalRouter.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0; - -interface IDelayedWithdrawalRouter { - // struct used to pack data into a single storage slot - struct DelayedWithdrawal { - uint224 amount; - uint32 blockCreated; - } - - // struct used to store a single users delayedWithdrawal data - struct UserDelayedWithdrawals { - uint256 delayedWithdrawalsCompleted; - DelayedWithdrawal[] delayedWithdrawals; - } - - /// @notice event for delayedWithdrawal creation - event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index); - - /// @notice event for the claiming of delayedWithdrawals - event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted); - - /// @notice Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); - - /** - * @notice Creates an delayed withdrawal for `msg.value` to the `recipient`. - * @dev Only callable by the `podOwner`'s EigenPod contract. - */ - function createDelayedWithdrawal(address podOwner, address recipient) external payable; - - /** - * @notice Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period. - * @param recipient The address to claim delayedWithdrawals for. - * @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming. - */ - function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) external; - - /** - * @notice Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period. - * @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming. - */ - function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) external; - - /// @notice Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - function setWithdrawalDelayBlocks(uint256 newValue) external; - - /// @notice Getter function for the mapping `_userWithdrawals` - function userWithdrawals(address user) external view returns (UserDelayedWithdrawals memory); - - /// @notice Getter function to get all delayedWithdrawals of the `user` - function getUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory); - - /// @notice Getter function to get all delayedWithdrawals that are currently claimable by the `user` - function getClaimableUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory); - - /// @notice Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array - function userDelayedWithdrawalByIndex(address user, uint256 index) external view returns (DelayedWithdrawal memory); - - /// @notice Getter function for fetching the length of the delayedWithdrawals array of a specific user - function userWithdrawalsLength(address user) external view returns (uint256); - - /// @notice Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable - function canClaimDelayedWithdrawal(address user, uint256 index) external view returns (bool); - - /** - * @notice Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner, - * up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - */ - function withdrawalDelayBlocks() external view returns (uint256); -} diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 8ef62e8ed..003c2aecd 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -3,7 +3,6 @@ pragma solidity >=0.5.0; import "../libraries/BeaconChainProofs.sol"; import "./IEigenPodManager.sol"; -import "./IBeaconChainOracle.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** diff --git a/src/contracts/interfaces/IEigenPodManager.sol b/src/contracts/interfaces/IEigenPodManager.sol index 2cc6d2372..ba0e575ea 100644 --- a/src/contracts/interfaces/IEigenPodManager.sol +++ b/src/contracts/interfaces/IEigenPodManager.sol @@ -5,7 +5,6 @@ import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; import "./IETHPOSDeposit.sol"; import "./IStrategyManager.sol"; import "./IEigenPod.sol"; -import "./IBeaconChainOracle.sol"; import "./IPausable.sol"; import "./ISlasher.sol"; import "./IStrategy.sol"; diff --git a/src/contracts/pods/DelayedWithdrawalRouter.sol b/src/contracts/pods/DelayedWithdrawalRouter.sol deleted file mode 100644 index 9e57cfa45..000000000 --- a/src/contracts/pods/DelayedWithdrawalRouter.sol +++ /dev/null @@ -1,238 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; -import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; -import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; -import "../interfaces/IEigenPodManager.sol"; -import "../interfaces/IDelayedWithdrawalRouter.sol"; -import "../permissions/Pausable.sol"; - -contract DelayedWithdrawalRouter is - Initializable, - OwnableUpgradeable, - ReentrancyGuardUpgradeable, - Pausable, - IDelayedWithdrawalRouter -{ - // index for flag that pauses withdrawals (i.e. 'delayedWithdrawal claims') when set - uint8 internal constant PAUSED_DELAYED_WITHDRAWAL_CLAIMS = 0; - - /** - * @notice Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner, - * up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - */ - uint256 public withdrawalDelayBlocks; - // the number of 12-second blocks in 30 days (60 * 60 * 24 * 30 / 12 = 216,000) - uint256 public constant MAX_WITHDRAWAL_DELAY_BLOCKS = 216000; - - /// @notice The EigenPodManager contract of EigenLayer. - IEigenPodManager public immutable eigenPodManager; - - /// @notice Mapping: user => struct storing all delayedWithdrawal info. Marked as internal with an external getter function named `userWithdrawals` - mapping(address => UserDelayedWithdrawals) internal _userWithdrawals; - - /// @notice Modifier used to permission a function to only be called by the EigenPod of the specified `podOwner` - modifier onlyEigenPod(address podOwner) { - require( - address(eigenPodManager.getPod(podOwner)) == msg.sender, - "DelayedWithdrawalRouter.onlyEigenPod: not podOwner's EigenPod" - ); - _; - } - - constructor(IEigenPodManager _eigenPodManager) { - require( - address(_eigenPodManager) != address(0), - "DelayedWithdrawalRouter.constructor: _eigenPodManager cannot be zero address" - ); - eigenPodManager = _eigenPodManager; - _disableInitializers(); - } - - function initialize( - address initOwner, - IPauserRegistry _pauserRegistry, - uint256 initPausedStatus, - uint256 _withdrawalDelayBlocks - ) external initializer { - _transferOwnership(initOwner); - _initializePauser(_pauserRegistry, initPausedStatus); - _setWithdrawalDelayBlocks(_withdrawalDelayBlocks); - } - - /** - * @notice Creates a delayed withdrawal for `msg.value` to the `recipient`. - * @dev Only callable by the `podOwner`'s EigenPod contract. - */ - function createDelayedWithdrawal( - address podOwner, - address recipient - ) external payable onlyEigenPod(podOwner) onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) { - require( - recipient != address(0), - "DelayedWithdrawalRouter.createDelayedWithdrawal: recipient cannot be zero address" - ); - uint224 withdrawalAmount = uint224(msg.value); - if (withdrawalAmount != 0) { - DelayedWithdrawal memory delayedWithdrawal = DelayedWithdrawal({ - amount: withdrawalAmount, - blockCreated: uint32(block.number) - }); - _userWithdrawals[recipient].delayedWithdrawals.push(delayedWithdrawal); - emit DelayedWithdrawalCreated( - podOwner, - recipient, - withdrawalAmount, - _userWithdrawals[recipient].delayedWithdrawals.length - 1 - ); - } - } - - /** - * @notice Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period. - * @param recipient The address to claim delayedWithdrawals for. - * @param maxNumberOfDelayedWithdrawalsToClaim Used to limit the maximum number of delayedWithdrawals to loop through claiming. - * @dev - * WARNING: Note that the caller of this function cannot control where the funds are sent, but they can control when the - * funds are sent once the withdrawal becomes claimable. - */ - function claimDelayedWithdrawals( - address recipient, - uint256 maxNumberOfDelayedWithdrawalsToClaim - ) external nonReentrant onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) { - _claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - } - - /** - * @notice Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period. - * @param maxNumberOfDelayedWithdrawalsToClaim Used to limit the maximum number of delayedWithdrawals to loop through claiming. - */ - function claimDelayedWithdrawals( - uint256 maxNumberOfDelayedWithdrawalsToClaim - ) external nonReentrant onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) { - _claimDelayedWithdrawals(msg.sender, maxNumberOfDelayedWithdrawalsToClaim); - } - - /// @notice Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - function setWithdrawalDelayBlocks(uint256 newValue) external onlyOwner { - _setWithdrawalDelayBlocks(newValue); - } - - /// @notice Getter function for the mapping `_userWithdrawals` - function userWithdrawals(address user) external view returns (UserDelayedWithdrawals memory) { - return _userWithdrawals[user]; - } - - /// @notice Getter function to get all delayedWithdrawals of the `user` - function getUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory) { - uint256 delayedWithdrawalsCompleted = _userWithdrawals[user].delayedWithdrawalsCompleted; - uint256 totalDelayedWithdrawals = _userWithdrawals[user].delayedWithdrawals.length; - uint256 userDelayedWithdrawalsLength = totalDelayedWithdrawals - delayedWithdrawalsCompleted; - DelayedWithdrawal[] memory userDelayedWithdrawals = new DelayedWithdrawal[](userDelayedWithdrawalsLength); - for (uint256 i = 0; i < userDelayedWithdrawalsLength; i++) { - userDelayedWithdrawals[i] = _userWithdrawals[user].delayedWithdrawals[delayedWithdrawalsCompleted + i]; - } - return userDelayedWithdrawals; - } - - /// @notice Getter function to get all delayedWithdrawals that are currently claimable by the `user` - function getClaimableUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory) { - uint256 delayedWithdrawalsCompleted = _userWithdrawals[user].delayedWithdrawalsCompleted; - uint256 totalDelayedWithdrawals = _userWithdrawals[user].delayedWithdrawals.length; - uint256 userDelayedWithdrawalsLength = totalDelayedWithdrawals - delayedWithdrawalsCompleted; - - uint256 firstNonClaimableWithdrawalIndex = userDelayedWithdrawalsLength; - - for (uint256 i = 0; i < userDelayedWithdrawalsLength; i++) { - DelayedWithdrawal memory delayedWithdrawal = _userWithdrawals[user].delayedWithdrawals[ - delayedWithdrawalsCompleted + i - ]; - // check if delayedWithdrawal can be claimed. break the loop as soon as a delayedWithdrawal cannot be claimed - if (block.number < delayedWithdrawal.blockCreated + withdrawalDelayBlocks) { - firstNonClaimableWithdrawalIndex = i; - break; - } - } - uint256 numberOfClaimableWithdrawals = firstNonClaimableWithdrawalIndex; - DelayedWithdrawal[] memory claimableDelayedWithdrawals = new DelayedWithdrawal[](numberOfClaimableWithdrawals); - - if (numberOfClaimableWithdrawals != 0) { - for (uint256 i = 0; i < numberOfClaimableWithdrawals; i++) { - claimableDelayedWithdrawals[i] = _userWithdrawals[user].delayedWithdrawals[ - delayedWithdrawalsCompleted + i - ]; - } - } - return claimableDelayedWithdrawals; - } - - /// @notice Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array - function userDelayedWithdrawalByIndex( - address user, - uint256 index - ) external view returns (DelayedWithdrawal memory) { - return _userWithdrawals[user].delayedWithdrawals[index]; - } - - /// @notice Getter function for fetching the length of the delayedWithdrawals array of a specific user - function userWithdrawalsLength(address user) external view returns (uint256) { - return _userWithdrawals[user].delayedWithdrawals.length; - } - - /// @notice Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable - function canClaimDelayedWithdrawal(address user, uint256 index) external view returns (bool) { - return ((index >= _userWithdrawals[user].delayedWithdrawalsCompleted) && - (block.number >= _userWithdrawals[user].delayedWithdrawals[index].blockCreated + withdrawalDelayBlocks)); - } - - /// @notice internal function used in both of the overloaded `claimDelayedWithdrawals` functions - function _claimDelayedWithdrawals(address recipient, uint256 maxNumberOfDelayedWithdrawalsToClaim) internal { - uint256 amountToSend = 0; - uint256 delayedWithdrawalsCompletedBefore = _userWithdrawals[recipient].delayedWithdrawalsCompleted; - uint256 _userWithdrawalsLength = _userWithdrawals[recipient].delayedWithdrawals.length; - uint256 i = 0; - while ( - i < maxNumberOfDelayedWithdrawalsToClaim && (delayedWithdrawalsCompletedBefore + i) < _userWithdrawalsLength - ) { - // copy delayedWithdrawal from storage to memory - DelayedWithdrawal memory delayedWithdrawal = _userWithdrawals[recipient].delayedWithdrawals[ - delayedWithdrawalsCompletedBefore + i - ]; - // check if delayedWithdrawal can be claimed. break the loop as soon as a delayedWithdrawal cannot be claimed - if (block.number < delayedWithdrawal.blockCreated + withdrawalDelayBlocks) { - break; - } - // otherwise, the delayedWithdrawal can be claimed, in which case we increase the amountToSend and increment i - amountToSend += delayedWithdrawal.amount; - // increment i to account for the delayedWithdrawal being claimed - unchecked { - ++i; - } - } - // mark the i delayedWithdrawals as claimed - _userWithdrawals[recipient].delayedWithdrawalsCompleted = delayedWithdrawalsCompletedBefore + i; - // actually send the ETH - if (amountToSend != 0) { - AddressUpgradeable.sendValue(payable(recipient), amountToSend); - } - emit DelayedWithdrawalsClaimed(recipient, amountToSend, delayedWithdrawalsCompletedBefore + i); - } - - /// @notice internal function for changing the value of `withdrawalDelayBlocks`. Also performs sanity check and emits an event. - function _setWithdrawalDelayBlocks(uint256 newValue) internal { - require( - newValue <= MAX_WITHDRAWAL_DELAY_BLOCKS, - "DelayedWithdrawalRouter._setWithdrawalDelayBlocks: newValue too large" - ); - emit WithdrawalDelayBlocksSet(withdrawalDelayBlocks, newValue); - withdrawalDelayBlocks = newValue; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[48] private __gap; -} diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 147a77a7e..ac78bc161 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -6,8 +6,6 @@ import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; -import "../interfaces/IBeaconChainOracle.sol"; - import "../permissions/Pausable.sol"; import "./EigenPodPausingConstants.sol"; import "./EigenPodManagerStorage.sol"; diff --git a/src/contracts/pods/EigenPodManagerStorage.sol b/src/contracts/pods/EigenPodManagerStorage.sol index 2719a3d2a..ebd6a4166 100644 --- a/src/contracts/pods/EigenPodManagerStorage.sol +++ b/src/contracts/pods/EigenPodManagerStorage.sol @@ -50,7 +50,7 @@ abstract contract EigenPodManagerStorage is IEigenPodManager { *******************************************************************************/ /// @notice [DEPRECATED] Previously used to query beacon block roots. We now use eip-4788 directly - IBeaconChainOracle internal __deprecated_beaconChainOracle; + address internal __deprecated_beaconChainOracle; /// @notice Pod owner to deployed EigenPod address mapping(address => IEigenPod) public ownerToPod; diff --git a/src/test/DepositWithdraw.t.sol b/src/test/DepositWithdraw.t.sol index 3d8a0f133..e3d341382 100644 --- a/src/test/DepositWithdraw.t.sol +++ b/src/test/DepositWithdraw.t.sol @@ -362,9 +362,6 @@ contract DepositWithdrawTests is EigenLayerTestHelper { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); ethPOSDeposit = new ETHPOSDepositMock(); pod = new EigenPod(ethPOSDeposit, eigenPodManager, GOERLI_GENESIS_TIME); diff --git a/src/test/EigenLayerDeployer.t.sol b/src/test/EigenLayerDeployer.t.sol index 6fc445380..0f4888fc5 100644 --- a/src/test/EigenLayerDeployer.t.sol +++ b/src/test/EigenLayerDeployer.t.sol @@ -11,7 +11,6 @@ import "../contracts/interfaces/IDelegationManager.sol"; import "../contracts/core/DelegationManager.sol"; import "../contracts/interfaces/IETHPOSDeposit.sol"; -import "../contracts/interfaces/IBeaconChainOracle.sol"; import "../contracts/core/StrategyManager.sol"; import "../contracts/strategies/StrategyBase.sol"; @@ -19,7 +18,6 @@ import "../contracts/core/Slasher.sol"; import "../contracts/pods/EigenPod.sol"; import "../contracts/pods/EigenPodManager.sol"; -import "../contracts/pods/DelayedWithdrawalRouter.sol"; import "../contracts/permissions/PauserRegistry.sol"; @@ -28,7 +26,6 @@ import "./utils/Operators.sol"; import "./mocks/LiquidStakingToken.sol"; import "./mocks/EmptyContract.sol"; import "./mocks/ETHDepositMock.sol"; -import "./mocks/BeaconChainOracleMock.sol"; import "forge-std/Test.sol"; @@ -44,7 +41,6 @@ contract EigenLayerDeployer is Operators { StrategyManager public strategyManager; EigenPodManager public eigenPodManager; IEigenPod public pod; - IDelayedWithdrawalRouter public delayedWithdrawalRouter; IETHPOSDeposit public ethPOSDeposit; IBeacon public eigenPodBeacon; @@ -97,16 +93,11 @@ contract EigenLayerDeployer is Operators { address strategyManagerAddress; address eigenPodManagerAddress; address podAddress; - address delayedWithdrawalRouterAddress; address eigenPodBeaconAddress; - address beaconChainOracleAddress; address emptyContractAddress; address operationsMultisig; address executorMultisig; - uint256 public initialBeaconChainOracleThreshold = 3; - - string internal goerliDeploymentConfig = vm.readFile("script/output/goerli/M1_deployment_goerli_2023_3_23.json"); // addresses excluded from fuzzing due to abnormal behavior. TODO: @Sidu28 define this better and give it a clearer name mapping(address => bool) fuzzedAddressMapping; @@ -123,13 +114,10 @@ contract EigenLayerDeployer is Operators { } //performs basic deployment before each test - // for fork tests run: forge test -vv --fork-url https://eth-goerli.g.alchemy.com/v2/demo -vv function setUp() public virtual { try vm.envUint("CHAIN_ID") returns (uint256 chainId) { if (chainId == 31337) { _deployEigenLayerContractsLocal(); - } else if (chainId == 5) { - _deployEigenLayerContractsGoerli(); } // If CHAIN_ID ENV is not set, assume local deployment on 31337 } catch { @@ -144,66 +132,6 @@ contract EigenLayerDeployer is Operators { fuzzedAddressMapping[address(slasher)] = true; } - function _deployEigenLayerContractsGoerli() internal { - _setAddresses(goerliDeploymentConfig); - pauser = operationsMultisig; - unpauser = executorMultisig; - // deploy proxy admin for ability to upgrade proxy contracts - eigenLayerProxyAdmin = ProxyAdmin(eigenLayerProxyAdminAddress); - - emptyContract = new EmptyContract(); - - //deploy pauser registry - eigenLayerPauserReg = PauserRegistry(eigenLayerPauserRegAddress); - - delegation = DelegationManager(delegationAddress); - strategyManager = StrategyManager(strategyManagerAddress); - slasher = Slasher(slasherAddress); - eigenPodManager = EigenPodManager(eigenPodManagerAddress); - delayedWithdrawalRouter = DelayedWithdrawalRouter(delayedWithdrawalRouterAddress); - - beaconChainOracleAddress = address(new BeaconChainOracleMock()); - - ethPOSDeposit = new ETHPOSDepositMock(); - pod = new EigenPod( - ethPOSDeposit, - eigenPodManager, - GOERLI_GENESIS_TIME - ); - - eigenPodBeacon = new UpgradeableBeacon(address(pod)); - - //simple ERC20 (**NOT** WETH-like!), used in a test strategy - weth = new ERC20PresetFixedSupply("weth", "WETH", wethInitialSupply, address(this)); - - // deploy StrategyBase contract implementation, then create upgradeable proxy that points to implementation and initialize it - baseStrategyImplementation = new StrategyBase(strategyManager); - wethStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, weth, eigenLayerPauserReg) - ) - ) - ); - - eigenToken = new ERC20PresetFixedSupply("eigen", "EIGEN", wethInitialSupply, address(this)); - - // deploy upgradeable proxy that points to StrategyBase implementation and initialize it - eigenStrat = StrategyBase( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(StrategyBase.initialize.selector, eigenToken, eigenLayerPauserReg) - ) - ) - ); - - stakers = [acct_0, acct_1]; - } - function _deployEigenLayerContractsLocal() internal { pauser = address(69); unpauser = address(489); @@ -232,10 +160,6 @@ contract EigenLayerDeployer is Operators { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - ethPOSDeposit = new ETHPOSDepositMock(); pod = new EigenPod( ethPOSDeposit, @@ -256,7 +180,6 @@ contract EigenLayerDeployer is Operators { slasher, delegation ); - DelayedWithdrawalRouter delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. eigenLayerProxyAdmin.upgradeAndCall( @@ -303,19 +226,6 @@ contract EigenLayerDeployer is Operators { 0 /*initialPausedStatus*/ ) ); - uint256 initPausedStatus = 0; - uint256 withdrawalDelayBlocks = PARTIAL_WITHDRAWAL_FRAUD_PROOF_PERIOD_BLOCKS; - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - eigenLayerReputedMultisig, - eigenLayerPauserReg, - initPausedStatus, - withdrawalDelayBlocks - ) - ); //simple ERC20 (**NOT** WETH-like!), used in a test strategy weth = new ERC20PresetFixedSupply("weth", "WETH", wethInitialSupply, address(this)); @@ -355,7 +265,6 @@ contract EigenLayerDeployer is Operators { strategyManagerAddress = stdJson.readAddress(config, ".addresses.strategyManager"); slasherAddress = stdJson.readAddress(config, ".addresses.slasher"); eigenPodManagerAddress = stdJson.readAddress(config, ".addresses.eigenPodManager"); - delayedWithdrawalRouterAddress = stdJson.readAddress(config, ".addresses.delayedWithdrawalRouter"); emptyContractAddress = stdJson.readAddress(config, ".addresses.emptyContract"); operationsMultisig = stdJson.readAddress(config, ".parameters.operationsMultisig"); executorMultisig = stdJson.readAddress(config, ".parameters.executorMultisig"); diff --git a/src/test/EigenPod.t.sol b/src/test/EigenPod.t.sol deleted file mode 100644 index 488272bd6..000000000 --- a/src/test/EigenPod.t.sol +++ /dev/null @@ -1,933 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../contracts/interfaces/IEigenPod.sol"; -import "../contracts/pods/DelayedWithdrawalRouter.sol"; -import "./utils/ProofParsing.sol"; -import "./EigenLayerDeployer.t.sol"; -import "../contracts/libraries/BeaconChainProofs.sol"; -import "./integration/mocks/EIP_4788_Oracle_Mock.t.sol"; -import "./harnesses/EigenPodHarness.sol"; - -contract EigenPodTests is ProofParsing, EigenPodPausingConstants { - using BytesLib for bytes; - using BeaconChainProofs for *; - - - uint256 internal constant GWEI_TO_WEI = 1e9; - uint64 public constant DENEB_FORK_TIMESTAMP_GOERLI = 1705473120; - - - bytes pubkey = - hex"88347ed1c492eedc97fc8c506a35d44d81f27a0c7a1c661b35913cfd15256c0cccbd34a83341f505c7de2983292f2cab"; - uint40 validatorIndex0 = 0; - uint40 validatorIndex1 = 1; - - - address podOwner = address(42000094993494); - - bool public IS_DENEB; - - Vm cheats = Vm(HEVM_ADDRESS); - DelegationManager public delegation; - IStrategyManager public strategyManager; - Slasher public slasher; - PauserRegistry public pauserReg; - - ProxyAdmin public eigenLayerProxyAdmin; - IEigenPodManager public eigenPodManager; - IEigenPod public podImplementation; - IDelayedWithdrawalRouter public delayedWithdrawalRouter; - IETHPOSDeposit public ethPOSDeposit; - UpgradeableBeacon public eigenPodBeacon; - EigenPodHarness public podInternalFunctionTester; - - // BeaconChainOracleMock public beaconChainOracle; - - // EIP-4788 oracle address - EIP_4788_Oracle_Mock constant EIP_4788_ORACLE = EIP_4788_Oracle_Mock(0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02); - uint256 constant SINGLE_VALIDATOR_STAKE = 32e18; - // Generated proofs use this EigenPodManager address as the address for Create2 pod deployments - address constant EPM_PROOFGEN_ADDRESS = 0x212224D2F2d262cd093eE13240ca4873fcCBbA3C; - - address pauser = address(69); - address unpauser = address(489); - - address podAddress = address(123); - mapping(address => bool) fuzzedAddressMapping; - bytes signature; - bytes32 depositDataRoot; - - uint32 WITHDRAWAL_DELAY_BLOCKS = 7 days / 12 seconds; - IStrategy[] public initializeStrategiesToSetDelayBlocks; - uint256[] public initializeWithdrawalDelayBlocks; - uint64 internal constant GOERLI_GENESIS_TIME = 1616508000; - uint64 internal constant SECONDS_PER_SLOT = 12; - - // bytes validatorPubkey = hex"93a0dd04ccddf3f1b419fdebf99481a2182c17d67cf14d32d6e50fc4bf8effc8db4a04b7c2f3a5975c1b9b74e2841888"; - - // EIGENPODMANAGER EVENTS - /// @notice Emitted to notify the update of the beaconChainOracle address - event BeaconOracleUpdated(address indexed newOracleAddress); - - /// @notice Emitted to notify the deployment of an EigenPod - event PodDeployed(address indexed eigenPod, address indexed podOwner); - - /// @notice Emitted to notify a deposit of beacon chain ETH recorded in the strategy manager - event BeaconChainETHDeposited(address indexed podOwner, uint256 amount); - - // EIGENPOD EVENTS - /// @notice Emitted when an ETH validator stakes via this eigenPod - event EigenPodStaked(bytes pubkey); - - /// @notice Emitted when an ETH validator's withdrawal credentials are successfully verified to be pointed to this eigenPod - event ValidatorRestaked(uint40 validatorIndex); - - /// @notice Emitted when an ETH validator's balance is updated in EigenLayer - event ValidatorBalanceUpdated(uint40 validatorIndex, uint64 balanceTimestamp, uint64 newBalanceGwei); - - /// @notice Emitted when an ETH validator is prove to have withdrawn from the beacon chain - event FullWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 withdrawalAmountGwei - ); - - /// @notice Emitted when a partial withdrawal claim is successfully redeemed - event PartialWithdrawalRedeemed( - uint40 validatorIndex, - uint64 withdrawalTimestamp, - address indexed recipient, - uint64 partialWithdrawalAmountGwei - ); - - /// @notice Emitted when restaked beacon chain ETH is withdrawn from the eigenPod. - event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount); - - // DELAYED WITHDRAWAL ROUTER EVENTS - /// @notice Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); - - /// @notice event for delayedWithdrawal creation - event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index); - - /// @notice event for the claiming of delayedWithdrawals - event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted); - - /// @notice Emitted when ETH that was previously received via the `receive` fallback is withdrawn - event NonBeaconChainETHWithdrawn(address indexed recipient, uint256 amountWithdrawn); - - modifier fuzzedAddress(address addr) virtual { - cheats.assume(fuzzedAddressMapping[addr] == false); - _; - } - - //performs basic deployment before each test - function setUp() public { - // deploy proxy admin for ability to upgrade proxy contracts - eigenLayerProxyAdmin = new ProxyAdmin(); - - // deploy pauser registry - address[] memory pausers = new address[](1); - pausers[0] = pauser; - pauserReg = new PauserRegistry(pausers, unpauser); - - /// weird workaround: check commit before this -- the call to `upgradeAndCall` the DelegationManager breaks without performing this step! - /// seems to be foundry bug. the revert is ultimately for 'TransparentUpgradeableProxy: admin cannot fallback to proxy target', i.e. - /// the simulated caller is somehow the ProxyAdmin itself. - EmptyContract emptyContract = new EmptyContract(); - - /** - * First, deploy upgradeable proxy contracts that **will point** to the implementations. Since the implementation contracts are - * not yet deployed, we give these proxies an empty contract as the initial implementation, to act as if they have no code. - */ - emptyContract = new EmptyContract(); - delegation = DelegationManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - strategyManager = StrategyManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - slasher = Slasher( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - - cheats.warp(GOERLI_GENESIS_TIME); // start at a sane timestamp - ethPOSDeposit = new ETHPOSDepositMock(); - podImplementation = new EigenPod( - ethPOSDeposit, - IEigenPodManager(EPM_PROOFGEN_ADDRESS), - GOERLI_GENESIS_TIME - ); - - // Create mock 4788 oracle - cheats.etch(address(EIP_4788_ORACLE), type(EIP_4788_Oracle_Mock).runtimeCode); - - eigenPodBeacon = new UpgradeableBeacon(address(podImplementation)); - - // this contract is deployed later to keep its address the same (for these tests) - eigenPodManager = EigenPodManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - - // Ensure the EPM's address is consistent so created pods work with proofgen - cheats.etch(EPM_PROOFGEN_ADDRESS, address(eigenPodManager).code); - eigenPodManager = IEigenPodManager(EPM_PROOFGEN_ADDRESS); - - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - DelegationManager delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); - StrategyManager strategyManagerImplementation = new StrategyManager( - delegation, - eigenPodManager, - slasher - ); - Slasher slasherImplementation = new Slasher(strategyManager, delegation); - EigenPodManager eigenPodManagerImplementation = new EigenPodManager( - ethPOSDeposit, - eigenPodBeacon, - strategyManager, - slasher, - delegation - ); - - podInternalFunctionTester = new EigenPodHarness( - ethPOSDeposit, - eigenPodManager, - GOERLI_GENESIS_TIME - ); - - DelayedWithdrawalRouter delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter( - eigenPodManager - ); - - address initialOwner = address(this); - // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delegation))), - address(delegationImplementation), - abi.encodeWithSelector( - DelegationManager.initialize.selector, - initialOwner, - pauserReg, - 0 /*initialPausedStatus*/, - WITHDRAWAL_DELAY_BLOCKS, - initializeStrategiesToSetDelayBlocks, - initializeWithdrawalDelayBlocks - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(strategyManager))), - address(strategyManagerImplementation), - abi.encodeWithSelector( - StrategyManager.initialize.selector, - initialOwner, - initialOwner, - pauserReg, - 0 /*initialPausedStatus*/ - ) - ); - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(slasher))), - address(slasherImplementation), - abi.encodeWithSelector(Slasher.initialize.selector, initialOwner, pauserReg, 0 /*initialPausedStatus*/) - ); - // TODO: add `cheats.expectEmit` calls for initialization events - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerImplementation), - abi.encodeWithSelector( - EigenPodManager.initialize.selector, - initialOwner, - pauserReg, - 0 /*initialPausedStatus*/ - ) - ); - uint256 initPausedStatus = 0; - uint256 withdrawalDelayBlocks = WITHDRAWAL_DELAY_BLOCKS; - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - initialOwner, - pauserReg, - initPausedStatus, - withdrawalDelayBlocks - ) - ); - - cheats.deal(address(podOwner), 5 * SINGLE_VALIDATOR_STAKE); - - fuzzedAddressMapping[address(0)] = true; - fuzzedAddressMapping[address(eigenLayerProxyAdmin)] = true; - fuzzedAddressMapping[address(strategyManager)] = true; - fuzzedAddressMapping[address(eigenPodManager)] = true; - fuzzedAddressMapping[address(delegation)] = true; - fuzzedAddressMapping[address(slasher)] = true; - } - - function testStaking() public { - cheats.startPrank(podOwner); - IEigenPod newPod = eigenPodManager.getPod(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - } - - function testDeployEigenPodWithoutActivateRestaking() public { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = getWithdrawalCredentialProof(); - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); - EIP_4788_ORACLE.setBlockRoot(GOERLI_GENESIS_TIME, getLatestBlockRoot()); - - //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 - cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); - - cheats.startPrank(podOwner); - cheats.warp(GOERLI_GENESIS_TIME); - cheats.expectRevert(bytes("EigenPod.verifyWithdrawalCredentials: restaking not active")); - newPod.verifyWithdrawalCredentials( - GOERLI_GENESIS_TIME, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - cheats.stopPrank(); - } - - // regression test for bug when activateRestaking -> verifyWC occur in the same epoch, in that order - function testEigenPodWithdrawalCredentialTimingBug(uint16 epochNum) public { - revert("TODO"); - // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - - // IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // cheats.startPrank(podOwner); - // cheats.expectEmit(true, true, true, true, address(newPod)); - // emit EigenPodStaked(pubkey); - // eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - // cheats.stopPrank(); - - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = getValidatorFields(); - // bytes[] memory proofsArray = new bytes[](1); - // proofsArray[0] = getWithdrawalCredentialProof(); - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(getValidatorIndex()); - // bytes32 beaconBlockRoot = getLatestBlockRoot(); - - // //this simulates that hasRestaking is set to false, as would be the case for deployed pods that have not yet restaked prior to M2 - // cheats.store(address(newPod), bytes32(uint256(52)), bytes32(uint256(0))); - // assertTrue(newPod.hasRestaked() == false, "EigenPod should not be restaked"); - - // uint64 startTime = GOERLI_GENESIS_TIME + (BeaconChainProofs.SECONDS_PER_EPOCH * epochNum); - // uint64 startEpoch = _timestampToEpoch(startTime); - // // move to start time - this is the first slot in the epoch, and is where we will call activateRestaking - // cheats.warp(startTime); - - // // activate restaking - // EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); - // cheats.startPrank(podOwner); - // newPod.startCheckpoint(false); - - // // Ensure verifyWC fails for each slot remaining in the epoch - // for (uint i = 0; i < 32; i++) { - // // Move forward 0-31 slots - // uint64 slotTimestamp = uint64(startTime + (BeaconChainProofs.SECONDS_PER_SLOT * i)); - // uint64 epoch = _timestampToEpoch(slotTimestamp); - // assertTrue(epoch == startEpoch, "calculated epoch should not change"); - - // EIP_4788_ORACLE.setBlockRoot(slotTimestamp, beaconBlockRoot); - // cheats.warp(slotTimestamp); - // cheats.expectRevert(bytes("EigenPod.verifyWithdrawalCredentials: proof must be in the epoch after activation")); - // newPod.verifyWithdrawalCredentials( - // slotTimestamp, - // stateRootProofStruct, - // validatorIndices, - // proofsArray, - // validatorFieldsArray - // ); - // } - - // // finally, move to the next epoch - // cheats.warp(block.timestamp + BeaconChainProofs.SECONDS_PER_SLOT); - // uint64 endEpoch = _timestampToEpoch(uint64(block.timestamp)); - // assertEq(startEpoch + 1, endEpoch, "should have advanced one epoch"); - - // // now verifyWC should succeed - // EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); - // newPod.verifyWithdrawalCredentials( - // uint64(block.timestamp), - // stateRootProofStruct, - // validatorIndices, - // proofsArray, - // validatorFieldsArray - // ); - - // cheats.stopPrank(); - } - - function _timestampToEpoch(uint64 timestamp) internal view returns (uint64) { - require(timestamp >= GOERLI_GENESIS_TIME, "Test._timestampToEpoch: timestamp is before genesis"); - return (timestamp - GOERLI_GENESIS_TIME) / BeaconChainProofs.SECONDS_PER_EPOCH; - } - - function testDeployAndVerifyNewEigenPod() public returns (IEigenPod) { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - return _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - } - - // /// @notice Similar test done in EP unit test - // //test deploying an eigen pod with mismatched withdrawal credentials between the proof and the actual pod's address - // function testDeployNewEigenPodWithWrongWithdrawalCreds(address wrongWithdrawalAddress) public { - // // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // cheats.startPrank(podOwner); - // IEigenPod newPod; - // newPod = eigenPodManager.getPod(podOwner); - // cheats.expectEmit(true, true, true, true, address(newPod)); - // emit EigenPodStaked(pubkey); - // eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - // cheats.stopPrank(); - - - // // make sure that wrongWithdrawalAddress is not set to actual pod address - // cheats.assume(wrongWithdrawalAddress != address(newPod)); - - // bytes32[] memory validatorFields = getValidatorFields(); - // validatorFields[1] = abi.encodePacked(bytes1(uint8(1)), bytes11(0), wrongWithdrawalAddress).toBytes32(0); - - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // validatorFieldsArray[0] = validatorFields; - // bytes[] memory proofsArray = new bytes[](1); - // proofsArray[0] = getWithdrawalCredentialProof(); - // uint40[] memory validatorIndices = new uint40[](1); - // validatorIndices[0] = uint40(validatorIndex0); - - // cheats.startPrank(podOwner); - // if (!newPod.hasRestaked()) { - // newPod.startCheckpoint(false); - // } - // // set oracle block root - // _setOracleBlockRoot(); - - // BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - // uint64 timestamp = _verifyWCStartTimestamp(newPod); - // cheats.warp(timestamp); - - // cheats.expectRevert(bytes("EigenPod.verifyCorrectWithdrawalCredentials: Proof is not for this EigenPod")); - // newPod.verifyWithdrawalCredentials( - // timestamp, - // stateRootProofStruct, - // validatorIndices, - // proofsArray, - // validatorFieldsArray - // ); - // cheats.stopPrank(); - // } - - function testVerifyWithdrawalCredsFromNonPodOwnerAddress(address nonPodOwnerAddress) public { - // nonPodOwnerAddress must be different from podOwner - cheats.assume(nonPodOwnerAddress != podOwner); - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - cheats.startPrank(podOwner); - - IEigenPod newPod = eigenPodManager.getPod(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = getWithdrawalCredentialProof(); - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(validatorIndex0); - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - uint64 timestamp = _verifyWCStartTimestamp(newPod); - cheats.warp(timestamp); - - cheats.startPrank(nonPodOwnerAddress); - cheats.expectRevert(bytes("EigenPod.onlyEigenPodOwner: not podOwner")); - newPod.verifyWithdrawalCredentials( - timestamp, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - cheats.stopPrank(); - } - - function testProveSingleWithdrawalCredential() public { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - IEigenPod pod = _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - bytes32 validatorPubkeyHash = getValidatorPubkeyHash(); - - assertTrue( - pod.validatorStatus(validatorPubkeyHash) == IEigenPod.VALIDATOR_STATUS.ACTIVE, - "wrong validator status" - ); - } - - function testDeployingEigenPodRevertsWhenPaused() external { - // pause the contract - cheats.startPrank(pauser); - eigenPodManager.pause(2 ** PAUSED_NEW_EIGENPODS); - cheats.stopPrank(); - - cheats.startPrank(podOwner); - cheats.expectRevert(bytes("Pausable: index is paused")); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - } - - function testCreatePodWhenPaused() external { - // pause the contract - cheats.startPrank(pauser); - eigenPodManager.pause(2 ** PAUSED_NEW_EIGENPODS); - cheats.stopPrank(); - - cheats.startPrank(podOwner); - cheats.expectRevert(bytes("Pausable: index is paused")); - eigenPodManager.createPod(); - cheats.stopPrank(); - } - - function testCreatePodIfItReturnsPodAddress() external { - cheats.startPrank(podOwner); - address _podAddress = eigenPodManager.createPod(); - cheats.stopPrank(); - IEigenPod pod = eigenPodManager.getPod(podOwner); - require(_podAddress == address(pod), "invalid pod address"); - } - - function testStakeOnEigenPodFromNonPodManagerAddress(address nonPodManager) external fuzzedAddress(nonPodManager) { - cheats.assume(nonPodManager != address(eigenPodManager)); - - cheats.startPrank(podOwner); - IEigenPod newPod = eigenPodManager.getPod(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - - cheats.deal(nonPodManager, SINGLE_VALIDATOR_STAKE); - - cheats.startPrank(nonPodManager); - cheats.expectRevert(bytes("EigenPod.onlyEigenPodManager: not eigenPodManager")); - newPod.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - } - - function testVerifyCorrectWithdrawalCredentialsRevertsWhenPaused() external { - // ./solidityProofGen -newBalance=32000115173 "ValidatorFieldsProof" 302913 true "data/withdrawal_proof_goerli/goerli_block_header_6399998.json" "data/withdrawal_proof_goerli/goerli_slot_6399998.json" "withdrawal_credential_proof_302913.json" - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - bytes32 newBeaconStateRoot = getBeaconStateRoot(); - - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - cheats.startPrank(podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - - // pause the contract - cheats.startPrank(pauser); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); - cheats.stopPrank(); - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - validatorFieldsArray[0] = getValidatorFields(); - - bytes[] memory proofsArray = new bytes[](1); - proofsArray[0] = getWithdrawalCredentialProof(); - - BeaconChainProofs.StateRootProof memory stateRootProofStruct = _getStateRootProof(); - - uint40[] memory validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); - - uint64 timestamp = _verifyWCStartTimestamp(newPod); - cheats.warp(timestamp); - EIP_4788_ORACLE.setBlockRoot(timestamp, newBeaconStateRoot); - - cheats.startPrank(podOwner); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - newPod.verifyWithdrawalCredentials( - timestamp, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - cheats.stopPrank(); - } - - function _getValidatorUpdatedBalance() internal returns (uint64) { - bytes32[] memory validatorFieldsToGet = getValidatorFields(); - return validatorFieldsToGet.getEffectiveBalanceGwei(); - } - - function testStake(bytes calldata _pubkey, bytes calldata _signature, bytes32 _depositDataRoot) public { - // should fail if no/wrong value is provided - cheats.startPrank(podOwner); - cheats.expectRevert("EigenPod.stake: must initially stake for any validator with 32 ether"); - eigenPodManager.stake(_pubkey, _signature, _depositDataRoot); - cheats.expectRevert("EigenPod.stake: must initially stake for any validator with 32 ether"); - eigenPodManager.stake{value: 12 ether}(_pubkey, _signature, _depositDataRoot); - - IEigenPod newPod = eigenPodManager.getPod(podOwner); - - // successful call - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(_pubkey); - eigenPodManager.stake{value: 32 ether}(_pubkey, _signature, _depositDataRoot); - cheats.stopPrank(); - } - - /// @notice Test that the Merkle proof verification fails when the proof length is 0 - function testVerifyInclusionSha256FailsForEmptyProof(bytes32 root, bytes32 leaf, uint256 index) public { - bytes memory emptyProof = new bytes(0); - cheats.expectRevert( - bytes("Merkle.processInclusionProofSha256: proof length should be a non-zero multiple of 32") - ); - Merkle.verifyInclusionSha256(emptyProof, root, leaf, index); - } - - /// @notice Test that the Merkle proof verification fails when the proof length is not a multple of 32 - function testVerifyInclusionSha256FailsForNonMultipleOf32ProofLength( - bytes32 root, - bytes32 leaf, - uint256 index, - bytes memory proof - ) public { - cheats.assume(proof.length % 32 != 0); - cheats.expectRevert( - bytes("Merkle.processInclusionProofSha256: proof length should be a non-zero multiple of 32") - ); - Merkle.verifyInclusionSha256(proof, root, leaf, index); - } - - // verifies that the `numPod` variable increments correctly on a succesful call to the `EigenPod.stake` function - function test_incrementNumPodsOnStake( - bytes calldata _pubkey, - bytes calldata _signature, - bytes32 _depositDataRoot - ) public { - uint256 numPodsBefore = EigenPodManager(address(eigenPodManager)).numPods(); - testStake(_pubkey, _signature, _depositDataRoot); - uint256 numPodsAfter = EigenPodManager(address(eigenPodManager)).numPods(); - require(numPodsAfter == numPodsBefore + 1, "numPods did not increment correctly"); - } - - // verifies that the `numPod` variable increments correctly on a succesful call to the `EigenPod.createPod` function - function test_incrementNumPodsOnCreatePod() public { - uint256 numPodsBefore = EigenPodManager(address(eigenPodManager)).numPods(); - eigenPodManager.createPod(); - uint256 numPodsAfter = EigenPodManager(address(eigenPodManager)).numPods(); - require(numPodsAfter == numPodsBefore + 1, "numPods did not increment correctly"); - } - - function test_createPodTwiceFails() public { - eigenPodManager.createPod(); - cheats.expectRevert(bytes("EigenPodManager.createPod: Sender already has a pod")); - eigenPodManager.createPod(); - } - - function test_validatorPubkeyToInfo() external { - bytes memory _pubkey = hex"93a0dd04ccddf3f1b419fdebf99481a2182c17d67cf14d32d6e50fc4bf8effc8db4a04b7c2f3a5975c1b9b74e2841888"; - - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod pod = eigenPodManager.getPod(podOwner); - - IEigenPod.ValidatorInfo memory info1 = pod.validatorPubkeyToInfo(_pubkey); - IEigenPod.ValidatorInfo memory info2 = pod.validatorPubkeyHashToInfo(getValidatorPubkeyHash()); - - require(info1.validatorIndex == info2.validatorIndex, "validatorIndex does not match"); - require(info1.restakedBalanceGwei > 0, "restakedBalanceGwei is 0"); - require(info1.restakedBalanceGwei == info2.restakedBalanceGwei, "restakedBalanceGwei does not match"); - require(info1.lastCheckpointedAt == info2.lastCheckpointedAt, "lastCheckpointedAt does not match"); - require(info1.status == info2.status, "status does not match"); - } - - function test_validatorStatus() external { - bytes memory _pubkey = hex"93a0dd04ccddf3f1b419fdebf99481a2182c17d67cf14d32d6e50fc4bf8effc8db4a04b7c2f3a5975c1b9b74e2841888"; - - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _testDeployAndVerifyNewEigenPod(podOwner, signature, depositDataRoot); - IEigenPod pod = eigenPodManager.getPod(podOwner); - - IEigenPod.VALIDATOR_STATUS status1 = pod.validatorStatus(_pubkey); - IEigenPod.VALIDATOR_STATUS status2 = pod.validatorStatus(getValidatorPubkeyHash()); - - require(status1 == status2, "status does not match"); - } - - function _verifyEigenPodBalanceSharesInvariant( - address podowner, - IEigenPod pod, - bytes32 validatorPubkeyHash - ) internal view { - int256 shares = eigenPodManager.podOwnerShares(podowner); - uint64 withdrawableRestakedExecutionLayerGwei = pod.withdrawableRestakedExecutionLayerGwei(); - - EigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(validatorPubkeyHash); - - uint64 validatorBalanceGwei = info.restakedBalanceGwei; - require( - shares / int256(GWEI_TO_WEI) == - int256(uint256(validatorBalanceGwei)) + int256(uint256(withdrawableRestakedExecutionLayerGwei)), - "EigenPod invariant violated: sharesInSM != withdrawableRestakedExecutionLayerGwei" - ); - } - - // simply tries to register 'sender' as a delegate, setting their 'DelegationTerms' contract in DelegationManager to 'dt' - // verifies that the storage of DelegationManager contract is updated appropriately - function _testRegisterAsOperator( - address sender, - IDelegationManager.OperatorDetails memory operatorDetails - ) internal { - cheats.startPrank(sender); - string memory emptyStringForMetadataURI; - delegation.registerAsOperator(operatorDetails, emptyStringForMetadataURI); - assertTrue(delegation.isOperator(sender), "testRegisterAsOperator: sender is not a delegate"); - - // TODO: FIX THIS - // assertTrue( - // delegation.delegationTerms(sender) == dt, "_testRegisterAsOperator: delegationTerms not set appropriately" - // ); - - assertTrue(delegation.isDelegated(sender), "_testRegisterAsOperator: sender not marked as actively delegated"); - cheats.stopPrank(); - } - - function _testDelegateToOperator(address sender, address operator) internal { - //delegator-specific information - (IStrategy[] memory delegateStrategies, uint256[] memory delegateShares) = strategyManager.getDeposits(sender); - - uint256 numStrats = delegateShares.length; - assertTrue(numStrats > 0, "_testDelegateToOperator: delegating from address with no deposits"); - uint256[] memory inititalSharesInStrats = new uint256[](numStrats); - for (uint256 i = 0; i < numStrats; ++i) { - inititalSharesInStrats[i] = delegation.operatorShares(operator, delegateStrategies[i]); - } - - cheats.startPrank(sender); - IDelegationManager.SignatureWithExpiry memory signatureWithExpiry; - delegation.delegateTo(operator, signatureWithExpiry, bytes32(0)); - cheats.stopPrank(); - - assertTrue( - delegation.delegatedTo(sender) == operator, - "_testDelegateToOperator: delegated address not set appropriately" - ); - assertTrue(delegation.isDelegated(sender), "_testDelegateToOperator: delegated status not set appropriately"); - - for (uint256 i = 0; i < numStrats; ++i) { - uint256 operatorSharesBefore = inititalSharesInStrats[i]; - uint256 operatorSharesAfter = delegation.operatorShares(operator, delegateStrategies[i]); - assertTrue( - operatorSharesAfter == (operatorSharesBefore + delegateShares[i]), - "_testDelegateToOperator: delegatedShares not increased correctly" - ); - } - } - - function _testDelegation(address operator, address staker) internal { - if (!delegation.isOperator(operator)) { - IDelegationManager.OperatorDetails memory operatorDetails = IDelegationManager.OperatorDetails({ - __deprecated_earningsReceiver: operator, - delegationApprover: address(0), - stakerOptOutWindowBlocks: 0 - }); - _testRegisterAsOperator(operator, operatorDetails); - } - - //making additional deposits to the strategies - assertTrue(!delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - _testDelegateToOperator(staker, operator); - assertTrue(delegation.isDelegated(staker) == true, "testDelegation: staker is not delegate"); - - IStrategy[] memory updatedStrategies; - uint256[] memory updatedShares; - (updatedStrategies, updatedShares) = strategyManager.getDeposits(staker); - } - - function _newPod_VerifiedWC( - address _podOwner, - bytes memory _signature, - bytes32 _depositDataRoot - ) internal returns (IEigenPod) { - IEigenPod pod = eigenPodManager.getPod(_podOwner); - - cheats.prank(_podOwner); - cheats.expectEmit(true, true, true, true, address(pod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, _signature, _depositDataRoot); - - _verifyWithdrawalCredentials(pod, _podOwner); - - return pod; - } - - function _testDeployAndVerifyNewEigenPod( - address _podOwner, - bytes memory _signature, - bytes32 _depositDataRoot - ) internal returns (IEigenPod) { - IEigenPod newPod = eigenPodManager.getPod(_podOwner); - - cheats.startPrank(_podOwner); - cheats.expectEmit(true, true, true, true, address(newPod)); - emit EigenPodStaked(pubkey); - eigenPodManager.stake{value: SINGLE_VALIDATOR_STAKE}(pubkey, _signature, _depositDataRoot); - cheats.stopPrank(); - - _verifyWithdrawalCredentials(newPod, _podOwner); - - return newPod; - } - - function _verifyWithdrawalCredentials(IEigenPod pod, address _podOwner) internal { - cheats.startPrank(podOwner); - - ( - bytes32 beaconBlockRoot, - BeaconChainProofs.StateRootProof memory stateRootProof, - uint40[] memory validatorIndices, - bytes[] memory validatorFieldsProofs, - bytes32[][] memory validatorFields - ) = _getWithdrawalCredentialProof(); - - // Set the 4788 oracle block root - EIP_4788_ORACLE.setBlockRoot(uint64(block.timestamp), beaconBlockRoot); - - int beaconChainETHSharesBefore = eigenPodManager.podOwnerShares(_podOwner); - - emit log_named_address("pod", address(pod)); - emit log_named_bytes32("wc", BeaconChainProofs.getWithdrawalCredentials(validatorFields[0])); - - pod.verifyWithdrawalCredentials( - uint64(block.timestamp), - stateRootProof, - validatorIndices, - validatorFieldsProofs, - validatorFields - ); - - int beaconChainETHSharesAfter = eigenPodManager.podOwnerShares(_podOwner); - uint effectiveBalanceWei = uint(BeaconChainProofs.getEffectiveBalanceGwei(validatorFields[0])) * GWEI_TO_WEI; - - emit log_named_uint("effectiveBalance (wei)", effectiveBalanceWei); - emit log_named_uint("beaconChainETHSharesAfter", uint(beaconChainETHSharesAfter)); - emit log_named_uint("beaconChainETHSharesBefore", uint(beaconChainETHSharesBefore)); - - assertEq(beaconChainETHSharesBefore + int(effectiveBalanceWei), beaconChainETHSharesAfter, - "_verifyWithdrawalCredentials: shares not updated correctly"); - - cheats.stopPrank(); - } - - function _verifyWCStartTimestamp(IEigenPod pod) internal returns (uint64) { - uint64 genesis = EigenPod(payable(address(pod))).GENESIS_TIME(); - uint64 activateRestakingTimestamp; - - // For pods deployed after M2, `mostRecentWithdrawalTimestamp` will always be 0 - // In order to give our `_nextEpochStartTimestamp` a sane calculation, we set it - // to the genesis time - if (activateRestakingTimestamp == 0) { - activateRestakingTimestamp = uint64(block.timestamp); - } - - emit log_named_uint("genesis", genesis); - emit log_named_uint("activation", activateRestakingTimestamp); - - return _nextEpochStartTimestamp(genesis, activateRestakingTimestamp); - } - - /// @dev Given a genesis time and a timestamp, converts the timestamp to an epoch - /// then calculates the next epoch's start timestamp. Used for the verifyWC proof window. - function _nextEpochStartTimestamp(uint64 genesisTime, uint64 timestamp) internal pure returns (uint64) { - require(timestamp >= genesisTime, "_verifyWCStartTimestamp: timestamp is before genesis"); - uint64 epoch = (timestamp - genesisTime) / BeaconChainProofs.SECONDS_PER_EPOCH; - - return genesisTime + ((1 + epoch) * BeaconChainProofs.SECONDS_PER_EPOCH); - } - - function _getLatestDelayedWithdrawalAmount(address recipient) internal view returns (uint256) { - return - delayedWithdrawalRouter - .userDelayedWithdrawalByIndex(recipient, delayedWithdrawalRouter.userWithdrawalsLength(recipient) - 1) - .amount; - } - - function _getStateRootProof() internal returns (BeaconChainProofs.StateRootProof memory) { - return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), getStateRootProof()); - } - - /// @dev Read various proving parameters from JSON - function _getWithdrawalCredentialProof() - internal - returns ( - bytes32 beaconBlockRoot, - BeaconChainProofs.StateRootProof memory stateRootProof, - uint40[] memory validatorIndices, - bytes[] memory validatorFieldsProofs, - bytes32[][] memory validatorFields - ) - { - beaconBlockRoot = getLatestBlockRoot(); - - stateRootProof = BeaconChainProofs.StateRootProof({ - beaconStateRoot: getBeaconStateRoot(), - proof: getStateRootProof() - }); - - validatorIndices = new uint40[](1); - validatorIndices[0] = uint40(getValidatorIndex()); - - validatorFieldsProofs = new bytes[](1); - validatorFieldsProofs[0] = getWithdrawalCredentialProof(); - - validatorFields = new bytes32[][](1); - validatorFields[0] = getValidatorFields(); - } - - function _computeTimestampAtSlot(uint64 slot) internal pure returns (uint64) { - return uint64(GOERLI_GENESIS_TIME + slot * SECONDS_PER_SLOT); - } -} \ No newline at end of file diff --git a/src/test/events/IEigenPodManagerEvents.sol b/src/test/events/IEigenPodManagerEvents.sol index 50caf34bf..8ccb80f17 100644 --- a/src/test/events/IEigenPodManagerEvents.sol +++ b/src/test/events/IEigenPodManagerEvents.sol @@ -2,9 +2,6 @@ pragma solidity ^0.8.12; interface IEigenPodManagerEvents { - /// @notice Emitted to notify the update of the beaconChainOracle address - event BeaconOracleUpdated(address indexed newOracleAddress); - /// @notice Emitted to notify that the denebForkTimestamp has been set event DenebForkTimestampUpdated(uint64 denebForkTimestamp); diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 1d4a5c675..fd5822eb5 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -16,7 +16,6 @@ import "src/contracts/strategies/StrategyBase.sol"; import "src/contracts/strategies/StrategyBaseTVLLimits.sol"; import "src/contracts/pods/EigenPodManager.sol"; import "src/contracts/pods/EigenPod.sol"; -import "src/contracts/pods/DelayedWithdrawalRouter.sol"; import "src/contracts/permissions/PauserRegistry.sol"; import "src/test/mocks/EmptyContract.sol"; @@ -101,8 +100,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { uint8 internal constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3; uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; uint8 internal constant PAUSED_NON_PROOF_WITHDRAWALS = 5; - // DelayedWithdrawalRouter - uint8 internal constant PAUSED_DELAYED_WITHDRAWAL_CLAIMS = 0; // Flags uint constant FLAG = 1; @@ -241,9 +238,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManager = EigenPodManager( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - delayedWithdrawalRouter = DelayedWithdrawalRouter( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); avsDirectory = AVSDirectory( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); @@ -268,7 +262,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { slasher, delegationManager ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); avsDirectoryImplementation = new AVSDirectory(delegationManager); // Third, upgrade the proxy contracts to point to the implementations @@ -323,18 +316,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { 0 // initialPausedStatus ) ); - // Delayed Withdrawal Router - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation), - abi.encodeWithSelector( - DelayedWithdrawalRouter.initialize.selector, - eigenLayerReputedMultisig, // initialOwner - eigenLayerPauserReg, - 0, // initialPausedStatus - withdrawalDelayBlocks - ) - ); // AVSDirectory eigenLayerProxyAdmin.upgradeAndCall( TransparentUpgradeableProxy(payable(address(avsDirectory))), @@ -399,7 +380,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { slasher, delegationManager ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); avsDirectoryImplementation = new AVSDirectory(delegationManager); // Second, upgrade the proxy contracts to point to the implementations @@ -423,11 +403,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { TransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation) ); - // Delayed Withdrawal Router - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation) - ); // AVSDirectory, upgrade and initalized eigenLayerProxyAdmin.upgradeAndCall( TransparentUpgradeableProxy(payable(address(avsDirectory))), @@ -499,7 +474,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { slasher, delegationManager ); - delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); avsDirectoryImplementation = new AVSDirectory(delegationManager); // Second, upgrade the proxy contracts to point to the implementations @@ -523,11 +497,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { TransparentUpgradeableProxy(payable(address(eigenPodManager))), address(eigenPodManagerImplementation) ); - // Delayed Withdrawal Router - eigenLayerProxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(delayedWithdrawalRouter))), - address(delayedWithdrawalRouterImplementation) - ); // AVSDirectory, upgrade and initalized eigenLayerProxyAdmin.upgradeAndCall( TransparentUpgradeableProxy(payable(address(avsDirectory))), diff --git a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol index 72a698e84..0171653be 100644 --- a/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol +++ b/src/test/integration/deprecatedInterfaces/mainnet/IEigenPod.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.12; import "./BeaconChainProofs.sol"; import "./IEigenPodManager.sol"; -import "./IBeaconChainOracle.sol"; /** * @notice DEPRECATED INTERFACE at commit hash https://github.com/Layr-Labs/eigenlayer-contracts/tree/0139d6213927c0a7812578899ddd3dda58051928 diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 58656303b..889da8ec0 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -139,7 +139,7 @@ contract BeaconChainMock is PrintUtils { } } - function NAME() public view override returns (string memory) { + function NAME() public pure override returns (string memory) { return "BeaconChain"; } @@ -792,7 +792,7 @@ contract BeaconChainMock is PrintUtils { return balances[validatorIndex / 4]; } - function _getBalanceRootIndex(uint40 validatorIndex) internal view returns (uint40) { + function _getBalanceRootIndex(uint40 validatorIndex) internal pure returns (uint40) { return validatorIndex / 4; } @@ -862,7 +862,7 @@ contract BeaconChainMock is PrintUtils { /// @dev Opposite of BeaconChainProofs.getBalanceAtIndex, calculates a new balance /// root by updating the balance at validatorIndex /// @return The new, updated balance root - function _calcBalanceRoot(bytes32 balanceRoot, uint40 validatorIndex, uint64 newBalanceGwei) internal returns (bytes32) { + function _calcBalanceRoot(bytes32 balanceRoot, uint40 validatorIndex, uint64 newBalanceGwei) internal pure returns (bytes32) { // Clear out old balance uint bitShiftAmount = 256 - (64 * ((validatorIndex % 4) + 1)); uint mask = ~(uint(0xFFFFFFFFFFFFFFFF) << bitShiftAmount); @@ -887,7 +887,7 @@ contract BeaconChainMock is PrintUtils { VIEW METHODS *******************************************************************************/ - function getCredentialProofs(uint40[] memory _validators) public returns (CredentialProofs memory) { + function getCredentialProofs(uint40[] memory _validators) public view returns (CredentialProofs memory) { // If we have not advanced an epoch since a validator was created, no proofs have been // generated for that validator. We check this here and revert early so we don't return // empty proofs. diff --git a/src/test/integration/mocks/BeaconChainOracleMock.t.sol b/src/test/integration/mocks/BeaconChainOracleMock.t.sol deleted file mode 100644 index b5a401c1f..000000000 --- a/src/test/integration/mocks/BeaconChainOracleMock.t.sol +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "src/contracts/interfaces/IBeaconChainOracle.sol"; - -contract BeaconChainOracleMock is IBeaconChainOracle { - - mapping(uint64 => bytes32) blockRoots; - - function timestampToBlockRoot(uint timestamp) public view returns (bytes32) { - return blockRoots[uint64(timestamp)]; - } - - function setBlockRoot(uint64 timestamp, bytes32 blockRoot) public { - blockRoots[timestamp] = blockRoot; - } -} diff --git a/src/test/integration/tests/Upgrade_Setup.t.sol b/src/test/integration/tests/Upgrade_Setup.t.sol index b1b2f2edd..cbfb4eb45 100644 --- a/src/test/integration/tests/Upgrade_Setup.t.sol +++ b/src/test/integration/tests/Upgrade_Setup.t.sol @@ -101,10 +101,5 @@ contract IntegrationMainnetFork_UpgradeSetup is IntegrationCheckUtils { eigenPodManager.delegationManager() == delegationManager, "eigenPodManager: delegationManager contract address not set correctly" ); - // DelayedWithdrawalRouter - require( - delayedWithdrawalRouter.eigenPodManager() == eigenPodManager, - "delayedWithdrawalRouterContract: eigenPodManager address not set correctly" - ); } } \ 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 61b123383..e26278921 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -244,7 +244,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { // Fully exit one or more validators and advance epoch without generating rewards uint40[] memory subset = _choose(validators); - uint64 exitedBalanceGwei = staker.exitValidators(subset); + staker.exitValidators(subset); beaconChain.advanceEpoch_NoRewards(); staker.completeCheckpoint(); diff --git a/src/test/mocks/BeaconChainOracleMock.sol b/src/test/mocks/BeaconChainOracleMock.sol deleted file mode 100644 index 890ca1a1e..000000000 --- a/src/test/mocks/BeaconChainOracleMock.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "../../contracts/interfaces/IBeaconChainOracle.sol"; - - - -contract BeaconChainOracleMock is IBeaconChainOracle { - - bytes32 public mockBeaconChainStateRoot; - - function getOracleBlockRootAtTimestamp() external view returns(bytes32) { - return mockBeaconChainStateRoot; - } - - function setOracleBlockRootAtTimestamp(bytes32 beaconChainStateRoot) external { - mockBeaconChainStateRoot = beaconChainStateRoot; - } - - function timestampToBlockRoot(uint256 /*blockNumber*/) external view returns(bytes32) { - return mockBeaconChainStateRoot; - } - - function isOracleSigner(address /*_oracleSigner*/) external pure returns(bool) { - return true; - } - - function hasVoted(uint64 /*blockNumber*/, address /*oracleSigner*/) external pure returns(bool) { - return true; - } - - function stateRootVotes(uint64 /*blockNumber*/, bytes32 /*stateRoot*/) external pure returns(uint256) { - return 0; - } - - function totalOracleSigners() external pure returns(uint256) { - return 0; - } - - function threshold() external pure returns(uint256) { - return 0; - } - - function setThreshold(uint256 /*_threshold*/) external pure {} - - function addOracleSigners(address[] memory /*_oracleSigners*/) external pure {} - - function removeOracleSigners(address[] memory /*_oracleSigners*/) external pure {} - - function voteForBeaconChainStateRoot(uint64 /*blockNumber*/, bytes32 /*stateRoot*/) external pure {} - - function latestConfirmedOracleBlockNumber() external pure returns(uint64) {} -} diff --git a/src/test/mocks/DelayedWithdrawalRouterMock.sol b/src/test/mocks/DelayedWithdrawalRouterMock.sol deleted file mode 100644 index 53077cd52..000000000 --- a/src/test/mocks/DelayedWithdrawalRouterMock.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0; - -import "../../contracts/interfaces/IDelayedWithdrawalRouter.sol"; - -contract DelayedWithdrawalRouterMock is IDelayedWithdrawalRouter { - /** - * @notice Creates an delayed withdrawal for `msg.value` to the `recipient`. - * @dev Only callable by the `podOwner`'s EigenPod contract. - */ - function createDelayedWithdrawal(address podOwner, address recipient) external payable{} - - /** - * @notice Called in order to withdraw delayed withdrawals made to the `recipient` that have passed the `withdrawalDelayBlocks` period. - * @param recipient The address to claim delayedWithdrawals for. - * @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming. - */ - function claimDelayedWithdrawals(address recipient, uint256 maxNumberOfWithdrawalsToClaim) external{} - - /** - * @notice Called in order to withdraw delayed withdrawals made to the caller that have passed the `withdrawalDelayBlocks` period. - * @param maxNumberOfWithdrawalsToClaim Used to limit the maximum number of withdrawals to loop through claiming. - */ - function claimDelayedWithdrawals(uint256 maxNumberOfWithdrawalsToClaim) external{} - - /// @notice Owner-only function for modifying the value of the `withdrawalDelayBlocks` variable. - function setWithdrawalDelayBlocks(uint256 newValue) external{} - - /// @notice Getter function for the mapping `_userWithdrawals` - function userWithdrawals(address user) external view returns (UserDelayedWithdrawals memory){} - - /// @notice Getter function to get all delayedWithdrawals of the `user` - function getUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory){} - - /// @notice Getter function to get all delayedWithdrawals that are currently claimable by the `user` - function getClaimableUserDelayedWithdrawals(address user) external view returns (DelayedWithdrawal[] memory){} - - /// @notice Getter function for fetching the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array - function userDelayedWithdrawalByIndex(address user, uint256 index) external view returns (DelayedWithdrawal memory){} - - /// @notice Getter function for fetching the length of the delayedWithdrawals array of a specific user - function userWithdrawalsLength(address user) external view returns (uint256){} - - /// @notice Convenience function for checking whether or not the delayedWithdrawal at the `index`th entry from the `_userWithdrawals[user].delayedWithdrawals` array is currently claimable - function canClaimDelayedWithdrawal(address user, uint256 index) external view returns (bool){} - - /** - * @notice Delay enforced by this contract for completing any delayedWithdrawal. Measured in blocks, and adjustable by this contract's owner, - * up to a maximum of `MAX_WITHDRAWAL_DELAY_BLOCKS`. Minimum value is 0 (i.e. no delay enforced). - */ - function withdrawalDelayBlocks() external view returns (uint256){} -} diff --git a/src/test/mocks/IBeaconChainOracleMock.sol b/src/test/mocks/IBeaconChainOracleMock.sol deleted file mode 100644 index 7ef4cc680..000000000 --- a/src/test/mocks/IBeaconChainOracleMock.sol +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -/** - * @title Interface for the BeaconStateOracle contract. - * @author Layr Labs, Inc. - * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service - */ -interface IBeaconChainOracleMock { - /// @notice Largest blockNumber that has been confirmed by the oracle. - function latestConfirmedOracleBlockNumber() external view returns(uint64); - /// @notice Mapping: Beacon Chain blockNumber => the Beacon Chain state root at the specified blockNumber. - /// @dev This will return `bytes32(0)` if the state root is not yet finalized at the blockNumber. - function beaconStateRootAtBlockNumber(uint64 blockNumber) external view returns(bytes32); - - /// @notice Mapping: address => whether or not the address is in the set of oracle signers. - function isOracleSigner(address _oracleSigner) external view returns(bool); - - /// @notice Mapping: Beacon Chain blockNumber => oracle signer address => whether or not the oracle signer has voted on the state root at the blockNumber. - function hasVoted(uint64 blockNumber, address oracleSigner) external view returns(bool); - - /// @notice Mapping: Beacon Chain blockNumber => state root => total number of oracle signer votes for the state root at the blockNumber. - function stateRootVotes(uint64 blockNumber, bytes32 stateRoot) external view returns(uint256); - - /// @notice Total number of members of the set of oracle signers. - function totalOracleSigners() external view returns(uint256); - - - function setOracleBlockRootAtTimestamp(bytes32 beaconChainStateRoot) external; - - - /** - * @notice Number of oracle signers that must vote for a state root in order for the state root to be confirmed. - * Adjustable by this contract's owner through use of the `setThreshold` function. - * @dev We note that there is an edge case -- when the threshold is adjusted downward, if a state root already has enough votes to meet the *new* threshold, - * the state root must still receive one additional vote from an oracle signer to be confirmed. This behavior is intended, to minimize unexpected root confirmations. - */ - function threshold() external view returns(uint256); - - /** - * @notice Owner-only function used to modify the value of the `threshold` variable. - * @param _threshold Desired new value for the `threshold` variable. Function will revert if this is set to zero. - */ - function setThreshold(uint256 _threshold) external; - - /** - * @notice Owner-only function used to add a signer to the set of oracle signers. - * @param _oracleSigners Array of address to be added to the set. - * @dev Function will have no effect on the i-th input address if `_oracleSigners[i]`is already in the set of oracle signers. - */ - function addOracleSigners(address[] memory _oracleSigners) external; - - /** - * @notice Owner-only function used to remove a signer from the set of oracle signers. - * @param _oracleSigners Array of address to be removed from the set. - * @dev Function will have no effect on the i-th input address if `_oracleSigners[i]`is already not in the set of oracle signers. - */ - function removeOracleSigners(address[] memory _oracleSigners) external; - - /** - * @notice Called by a member of the set of oracle signers to assert that the Beacon Chain state root is `stateRoot` at `blockNumber`. - * @dev The state root will be finalized once the total number of votes *for this exact state root at this exact blockNumber* meets the `threshold` value. - * @param blockNumber The Beacon Chain blockNumber of interest. - * @param stateRoot The Beacon Chain state root that the caller asserts was the correct root, at the specified `blockNumber`. - */ - function voteForBeaconChainStateRoot(uint64 blockNumber, bytes32 stateRoot) external; -} diff --git a/src/test/unit/DelayedWithdrawalRouterUnit.t.sol b/src/test/unit/DelayedWithdrawalRouterUnit.t.sol deleted file mode 100644 index 75c1458ad..000000000 --- a/src/test/unit/DelayedWithdrawalRouterUnit.t.sol +++ /dev/null @@ -1,475 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/utils/Address.sol"; - -import "../../contracts/pods/DelayedWithdrawalRouter.sol"; -import "../../contracts/permissions/PauserRegistry.sol"; - -import "../mocks/EigenPodManagerMock.sol"; -import "../mocks/Reenterer.sol"; - -import "forge-std/Test.sol"; - -/// @notice Deprecated contract for ETH withdrawals from EigenPods -contract DelayedWithdrawalRouterUnitTests is Test { - - // Vm cheats = Vm(HEVM_ADDRESS); - - // ProxyAdmin public proxyAdmin; - // PauserRegistry public pauserRegistry; - - // EigenPodManagerMock public eigenPodManagerMock; - - // DelayedWithdrawalRouter public delayedWithdrawalRouterImplementation; - // DelayedWithdrawalRouter public delayedWithdrawalRouter; - - // Reenterer public reenterer; - - // address public pauser = address(555); - // address public unpauser = address(999); - - // address initialOwner = address(this); - - // uint224[] public delayedWithdrawalAmounts; - - // uint256 internal _pseudorandomNumber; - - // // index for flag that pauses withdrawals (i.e. 'delayedWithdrawal claims') when set - // uint8 internal constant PAUSED_PAYMENT_CLAIMS = 0; - - // mapping(address => bool) public addressIsExcludedFromFuzzedInputs; - - // modifier filterFuzzedAddressInputs(address fuzzedAddress) { - // cheats.assume(!addressIsExcludedFromFuzzedInputs[fuzzedAddress]); - // _; - // } - - // /// @notice Emitted when the `withdrawalDelayBlocks` variable is modified from `previousValue` to `newValue`. - // event WithdrawalDelayBlocksSet(uint256 previousValue, uint256 newValue); - - // /// @notice event for delayedWithdrawal creation - // event DelayedWithdrawalCreated(address podOwner, address recipient, uint256 amount, uint256 index); - - // /// @notice event for the claiming of delayedWithdrawals - // event DelayedWithdrawalsClaimed(address recipient, uint256 amountClaimed, uint256 delayedWithdrawalsCompleted); - - // function setUp() external { - // proxyAdmin = new ProxyAdmin(); - - // address[] memory pausers = new address[](1); - // pausers[0] = pauser; - // pauserRegistry = new PauserRegistry(pausers, unpauser); - - // eigenPodManagerMock = new EigenPodManagerMock(); - - // delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManagerMock); - - // uint256 initPausedStatus = 0; - // uint256 withdrawalDelayBlocks = delayedWithdrawalRouterImplementation.MAX_WITHDRAWAL_DELAY_BLOCKS(); - // delayedWithdrawalRouter = DelayedWithdrawalRouter( - // address( - // new TransparentUpgradeableProxy( - // address(delayedWithdrawalRouterImplementation), - // address(proxyAdmin), - // abi.encodeWithSelector(DelayedWithdrawalRouter.initialize.selector, initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks) - // ) - // ) - // ); - - // reenterer = new Reenterer(); - - // // exclude the zero address, the proxyAdmin, and this contract from fuzzed inputs - // addressIsExcludedFromFuzzedInputs[address(0)] = true; - // addressIsExcludedFromFuzzedInputs[address(proxyAdmin)] = true; - // addressIsExcludedFromFuzzedInputs[address(this)] = true; - // } - - // function testCannotReinitialize() external { - // uint256 initPausedStatus = 0; - // uint256 withdrawalDelayBlocks = delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS(); - // cheats.expectRevert(bytes("Initializable: contract is already initialized")); - // delayedWithdrawalRouter.initialize(initialOwner, pauserRegistry, initPausedStatus, withdrawalDelayBlocks); - // } - - // function testCreateDelayedWithdrawalNonzeroAmount(uint224 delayedWithdrawalAmount, address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { - // cheats.assume(delayedWithdrawalAmount != 0); - // cheats.assume(recipient != address(0)); - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - - // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - // cheats.deal(podAddress, delayedWithdrawalAmount); - // cheats.startPrank(podAddress); - // uint256 userWithdrawalsLength = delayedWithdrawalRouter.userWithdrawalsLength(recipient); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalCreated(podOwner, recipient, delayedWithdrawalAmount, userWithdrawalsLength); - // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); - // cheats.stopPrank(); - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - - // require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length + 1, - // "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length + 1"); - - // IDelayedWithdrawalRouter.DelayedWithdrawal memory delayedWithdrawal = userWithdrawalsAfter.delayedWithdrawals[userWithdrawalsAfter.delayedWithdrawals.length - 1]; - // require(delayedWithdrawal.amount == delayedWithdrawalAmount, "delayedWithdrawal.amount != delayedWithdrawalAmount"); - // require(delayedWithdrawal.blockCreated == block.number, "delayedWithdrawal.blockCreated != block.number"); - // } - - - // function testCreateDelayedWithdrawalZeroAmount(address podOwner, address recipient) public filterFuzzedAddressInputs(podOwner) { - // cheats.assume(recipient != address(0)); - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - // uint224 delayedWithdrawalAmount = 0; - // cheats.assume(recipient != address(0)); - // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - // cheats.deal(podAddress, delayedWithdrawalAmount); - // cheats.startPrank(podAddress); - // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, recipient); - // cheats.stopPrank(); - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - - // // verify that no new 'delayedWithdrawal' was created - // require(userWithdrawalsAfter.delayedWithdrawals.length == userWithdrawalsBefore.delayedWithdrawals.length, - // "userWithdrawalsAfter.delayedWithdrawals.length != userWithdrawalsBefore.delayedWithdrawals.length"); - // } - - // function testCreateDelayedWithdrawalZeroAddress(address podOwner) external filterFuzzedAddressInputs(podOwner) { - // uint224 delayedWithdrawalAmount = 0; - // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - // cheats.assume(podAddress != address(proxyAdmin)); - // cheats.startPrank(podAddress); - // cheats.expectRevert(bytes("DelayedWithdrawalRouter.createDelayedWithdrawal: recipient cannot be zero address")); - // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); - // } - - // function testCreateDelayedWithdrawalFromNonPodAddress(address podOwner, address nonPodAddress) external filterFuzzedAddressInputs(podOwner) filterFuzzedAddressInputs(nonPodAddress) { - // uint224 delayedWithdrawalAmount = 0; - // address podAddress = address(eigenPodManagerMock.getPod(podOwner)); - // cheats.assume(nonPodAddress != podAddress); - // cheats.assume(nonPodAddress != address(proxyAdmin)); - - // cheats.startPrank(nonPodAddress); - // cheats.expectRevert(bytes("DelayedWithdrawalRouter.onlyEigenPod: not podOwner's EigenPod")); - // delayedWithdrawalRouter.createDelayedWithdrawal{value: delayedWithdrawalAmount}(podOwner, address(0)); - // } - - // function testClaimDelayedWithdrawals( - // uint8 delayedWithdrawalsToCreate, - // uint8 maxNumberOfDelayedWithdrawalsToClaim, - // uint256 pseudorandomNumber_, - // address recipient, - // bool useOverloadedFunction - // ) - // public filterFuzzedAddressInputs(recipient) - // { - // // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function - // cheats.assume(!Address.isContract(recipient)); - // // filter out precompile addresses (they won't accept delayedWithdrawal either) - // cheats.assume(uint160(recipient) > 256); - // // filter fuzzed inputs to avoid running out of gas & excessive test run-time - // cheats.assume(delayedWithdrawalsToCreate <= 32); - - // address podOwner = address(88888); - - // // create the delayedWithdrawals - // _pseudorandomNumber = pseudorandomNumber_; - // uint8 delayedWithdrawalsCreated; - // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - // if (delayedWithdrawalAmount != 0) { - // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - // delayedWithdrawalsCreated += 1; - // } - // } - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - // uint256 userBalanceBefore = recipient.balance; - - // // pre-condition check - // require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated, "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated"); - - // // roll forward the block number enough to make the delayedWithdrawals claimable - // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); - - // // find the expected number of completed withdrawals and the expected total withdrawal amount - // uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = - // (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated) ? delayedWithdrawalsCreated : maxNumberOfDelayedWithdrawalsToClaim; - // uint256 totalDelayedWithdrawalAmount = 0; - // for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { - // totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; - // } - - // // claim the delayedWithdrawals - // if (delayedWithdrawalsCreated != 0) { - // if (useOverloadedFunction) { - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - // } else { - // cheats.startPrank(recipient); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - // cheats.stopPrank(); - // } - // } - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - // uint256 userBalanceAfter = recipient.balance; - - // // post-conditions - // require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, - // "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); - // require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, - // "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); - // } - - // /// @notice This function is used to test the getter function 'getClaimableDelayedWithdrawals' - // function testDelayedWithdrawalsGetterFunctions(uint8 delayedWithdrawalsToCreate, uint224 delayedWithdrawalAmount, address recipient) - // public filterFuzzedAddressInputs(recipient) - // { - // cheats.assume(delayedWithdrawalAmount != 0); - // cheats.assume(delayedWithdrawalsToCreate > 5); - // // filter contracts out of fuzzed recipient input, since most don't implement a payable fallback function - // cheats.assume(!Address.isContract(recipient)); - // // filter out precompile addresses (they won't accept delayedWithdrawal either) - // cheats.assume(uint160(recipient) > 256); - // // filter fuzzed inputs to avoid running out of gas & excessive test run-time - // cheats.assume(delayedWithdrawalsToCreate <= 32); - - // address podOwner = address(88888); - - // // create the delayedWithdrawals - // uint8 delayedWithdrawalsCreated; - // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - // delayedWithdrawalsCreated += 1; - // cheats.roll(block.number + 1); // make sure each delayedWithdrawal has a unique block number - // } - - // require(delayedWithdrawalRouter.getUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, "Incorrect number delayed withdrawals"); - - // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() - delayedWithdrawalsToCreate); - // for (uint256 i = 1; i <= delayedWithdrawalsToCreate; ++i) { - // uint256 length = delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length; - // require(length == i, "Incorrect number of claimable delayed withdrawals"); - // cheats.roll(block.number + 1); - // } - // require(delayedWithdrawalRouter.getClaimableUserDelayedWithdrawals(recipient).length == delayedWithdrawalsCreated, - // "Incorrect number of claimable delayed withdrawals"); - // } - - - // /** - // * @notice Creates a set of delayedWithdrawals of length (2 * `delayedWithdrawalsToCreate`), - // * where only the first half is claimable, claims using `maxNumberOfDelayedWithdrawalsToClaim` input, - // * and checks that only appropriate delayedWithdrawals were claimed. - // */ - // function testClaimDelayedWithdrawalsSomeUnclaimable(uint8 delayedWithdrawalsToCreate, uint8 maxNumberOfDelayedWithdrawalsToClaim, bool useOverloadedFunction) - // external - // { - // // filter fuzzed inputs to avoid running out of gas & excessive test run-time - // cheats.assume(delayedWithdrawalsToCreate <= 32); - - // address podOwner = address(88888); - // address recipient = address(22222); - - // // create the first set of delayedWithdrawals - // _pseudorandomNumber = 1554; - // uint256 delayedWithdrawalsCreated_1; - // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - // if (delayedWithdrawalAmount != 0) { - // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - // delayedWithdrawalsCreated_1 += 1; - // } - // } - - // // roll forward the block number half of the delay window - // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); - - // // create the second set of delayedWithdrawals - // uint256 delayedWithdrawalsCreated_2; - // for (uint256 i = 0; i < delayedWithdrawalsToCreate; ++i) { - // uint224 delayedWithdrawalAmount = uint224(_getPseudorandomNumber()); - // if (delayedWithdrawalAmount != 0) { - // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - // delayedWithdrawalAmounts.push(delayedWithdrawalAmount); - // delayedWithdrawalsCreated_2 += 1; - // } - // } - - // // roll forward the block number half of the delay window -- the first set of delayedWithdrawals should now be claimable, while the second shouldn't be! - // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks() / 2); - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsBefore = delayedWithdrawalRouter.userWithdrawals(recipient); - // uint256 userBalanceBefore = recipient.balance; - - // // pre-condition check - // require(userWithdrawalsBefore.delayedWithdrawals.length == delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2, - // "userWithdrawalsBefore.delayedWithdrawals.length != delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2"); - - // // find the expected number of completed withdrawals and the expected total withdrawal amount - // uint256 numberOfDelayedWithdrawalsThatShouldBeCompleted = - // (maxNumberOfDelayedWithdrawalsToClaim > delayedWithdrawalsCreated_1) ? delayedWithdrawalsCreated_1 : maxNumberOfDelayedWithdrawalsToClaim; - // uint256 totalDelayedWithdrawalAmount = 0; - // for (uint256 i = 0; i < numberOfDelayedWithdrawalsThatShouldBeCompleted; ++i) { - // totalDelayedWithdrawalAmount += delayedWithdrawalAmounts[i]; - // } - - // // claim the delayedWithdrawals - // if (delayedWithdrawalsCreated_1 + delayedWithdrawalsCreated_2 != 0) { - // if (useOverloadedFunction) { - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - // } else { - // cheats.startPrank(recipient); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit DelayedWithdrawalsClaimed(recipient, totalDelayedWithdrawalAmount, numberOfDelayedWithdrawalsThatShouldBeCompleted); - // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - // cheats.stopPrank(); - // } - // } - - // IDelayedWithdrawalRouter.UserDelayedWithdrawals memory userWithdrawalsAfter = delayedWithdrawalRouter.userWithdrawals(recipient); - // uint256 userBalanceAfter = recipient.balance; - - // // post-conditions - // require(userWithdrawalsAfter.delayedWithdrawalsCompleted == userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted, - // "userWithdrawalsAfter.delayedWithdrawalsCompleted != userWithdrawalsBefore.delayedWithdrawalsCompleted + numberOfDelayedWithdrawalsThatShouldBeCompleted"); - // require(userBalanceAfter == userBalanceBefore + totalDelayedWithdrawalAmount, - // "userBalanceAfter != userBalanceBefore + totalDelayedWithdrawalAmount"); - // } - - // function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - // uint8 delayedWithdrawalsToCreate = 0; - // uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; - // address recipient = address(22222); - // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - // } - - // function testClaimDelayedWithdrawals_NoneToClaim_AttemptToClaimNonzero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - // uint8 delayedWithdrawalsToCreate = 0; - // uint8 maxNumberOfDelayedWithdrawalsToClaim = 2; - // address recipient = address(22222); - // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - // } - - // function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimZero(uint256 pseudorandomNumber_, bool useOverloadedFunction) external { - // uint8 delayedWithdrawalsToCreate = 2; - // uint8 maxNumberOfDelayedWithdrawalsToClaim = 0; - // address recipient = address(22222); - // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - // } - - // function testClaimDelayedWithdrawals_NonzeroToClaim_AttemptToClaimNonzero( - // uint8 maxNumberOfDelayedWithdrawalsToClaim, uint256 pseudorandomNumber_, bool useOverloadedFunction - // )external { - // uint8 delayedWithdrawalsToCreate = 2; - // address recipient = address(22222); - // testClaimDelayedWithdrawals(delayedWithdrawalsToCreate, maxNumberOfDelayedWithdrawalsToClaim, pseudorandomNumber_, recipient, useOverloadedFunction); - // } - - // function testClaimDelayedWithdrawals_RevertsOnAttemptingReentrancy(bool useOverloadedFunction) external { - // uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; - // address recipient = address(reenterer); - // address podOwner = address(reenterer); - - // // create the delayedWithdrawal - // uint224 delayedWithdrawalAmount = 123; - // testCreateDelayedWithdrawalNonzeroAmount(delayedWithdrawalAmount, podOwner, recipient); - - // // roll forward the block number enough to make the delayedWithdrawal claimable - // cheats.roll(block.number + delayedWithdrawalRouter.withdrawalDelayBlocks()); - - // // prepare the Reenterer contract - // address targetToUse = address(delayedWithdrawalRouter); - // uint256 msgValueToUse = 0; - // bytes memory expectedRevertDataToUse = bytes("ReentrancyGuard: reentrant call"); - // bytes memory callDataToUse; - // if (useOverloadedFunction) { - // callDataToUse = abi.encodeWithSignature( - // "claimDelayedWithdrawals(address,uint256)", address(22222), maxNumberOfDelayedWithdrawalsToClaim); - // } else { - // callDataToUse = abi.encodeWithSignature( - // "claimDelayedWithdrawals(uint256)", maxNumberOfDelayedWithdrawalsToClaim); - // } - // reenterer.prepare(targetToUse, msgValueToUse, callDataToUse, expectedRevertDataToUse); - - // if (useOverloadedFunction) { - // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - // } else { - // cheats.startPrank(recipient); - // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - // cheats.stopPrank(); - // } - // } - - // function testClaimDelayedWithdrawals_RevertsWhenPaused(bool useOverloadedFunction) external { - // uint8 maxNumberOfDelayedWithdrawalsToClaim = 1; - // address recipient = address(22222); - - // // pause delayedWithdrawal claims - // cheats.startPrank(pauser); - // delayedWithdrawalRouter.pause(2 ** PAUSED_PAYMENT_CLAIMS); - // cheats.stopPrank(); - - // cheats.expectRevert(bytes("Pausable: index is paused")); - // if (useOverloadedFunction) { - // delayedWithdrawalRouter.claimDelayedWithdrawals(recipient, maxNumberOfDelayedWithdrawalsToClaim); - // } else { - // cheats.startPrank(recipient); - // delayedWithdrawalRouter.claimDelayedWithdrawals(maxNumberOfDelayedWithdrawalsToClaim); - // cheats.stopPrank(); - // } - // } - - // function testSetWithdrawalDelayBlocks(uint16 valueToSet) external { - // // filter fuzzed inputs to allowed amounts - // cheats.assume(valueToSet <= delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); - - // // set the `withdrawalDelayBlocks` variable - // cheats.startPrank(delayedWithdrawalRouter.owner()); - // uint256 previousValue = delayedWithdrawalRouter.withdrawalDelayBlocks(); - // cheats.expectEmit(true, true, true, true, address(delayedWithdrawalRouter)); - // emit WithdrawalDelayBlocksSet(previousValue, uint256(valueToSet)); - // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - // cheats.stopPrank(); - // require(delayedWithdrawalRouter.withdrawalDelayBlocks() == valueToSet, "delayedWithdrawalRouter.withdrawalDelayBlocks() != valueToSet"); - // } - - // function testSetWithdrawalDelayBlocksRevertsWhenCalledByNotOwner(address notOwner) filterFuzzedAddressInputs(notOwner) external { - // cheats.assume(notOwner != delayedWithdrawalRouter.owner()); - - // uint256 valueToSet = 1; - // // set the `withdrawalDelayBlocks` variable - // cheats.startPrank(notOwner); - // cheats.expectRevert(bytes("Ownable: caller is not the owner")); - // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - // cheats.stopPrank(); - // } - - // function testSetWithdrawalDelayBlocksRevertsWhenInputValueTooHigh(uint256 valueToSet) external { - // // filter fuzzed inputs to disallowed amounts - // cheats.assume(valueToSet > delayedWithdrawalRouter.MAX_WITHDRAWAL_DELAY_BLOCKS()); - - // // attempt to set the `withdrawalDelayBlocks` variable - // cheats.startPrank(delayedWithdrawalRouter.owner()); - // cheats.expectRevert(bytes("DelayedWithdrawalRouter._setWithdrawalDelayBlocks: newValue too large")); - // delayedWithdrawalRouter.setWithdrawalDelayBlocks(valueToSet); - // } - - // function _getPseudorandomNumber() internal returns (uint256) { - // _pseudorandomNumber = uint256(keccak256(abi.encode(_pseudorandomNumber))); - // return _pseudorandomNumber; - // } -} diff --git a/src/test/unit/EigenPod-PodManagerUnit.t.sol b/src/test/unit/EigenPod-PodManagerUnit.t.sol deleted file mode 100644 index 931173364..000000000 --- a/src/test/unit/EigenPod-PodManagerUnit.t.sol +++ /dev/null @@ -1,642 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; - -import "src/contracts/pods/EigenPodManager.sol"; -import "src/contracts/pods/EigenPod.sol"; -import "src/contracts/pods/EigenPodPausingConstants.sol"; - -import "src/test/utils/EigenLayerUnitTestSetup.sol"; -import "src/test/utils/ProofParsing.sol"; -import "src/test/harnesses/EigenPodManagerWrapper.sol"; -import "src/test/mocks/EigenPodMock.sol"; -import "src/test/mocks/Dummy.sol"; -import "src/test/mocks/ETHDepositMock.sol"; -import "src/test/mocks/DelayedWithdrawalRouterMock.sol"; -import "src/test/mocks/BeaconChainOracleMock.sol"; -import "src/test/mocks/Reenterer.sol"; -import "src/test/events/IEigenPodEvents.sol"; -import "src/test/events/IEigenPodManagerEvents.sol"; - -contract EigenPod_PodManager_UnitTests is EigenLayerUnitTestSetup { - // Contracts Under Test: EigenPodManager & EigenPod - EigenPod public eigenPod; - EigenPod public podImplementation; - IBeacon public eigenPodBeacon; - EigenPodManager public eigenPodManager; - EigenPodManager public eigenPodManagerImplementation; - EigenPodManagerWrapper public eigenPodManagerWrapper; // Implementation contract - - // Mocks - IETHPOSDeposit public ethPOSMock; - IDelayedWithdrawalRouter public delayedWithdrawalRouterMock; - BeaconChainOracleMock beaconChainOracle; - - // Constants - uint64 public constant MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = 32e9; - uint64 public constant GOERLI_GENESIS_TIME = 1616508000; - address public initialOwner = address(this); - - // Owner for which proofs are generated; eigenPod above is owned by this address - bytes internal constant beaconProxyBytecode = - hex"608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564"; - address public constant podOwner = address(42000094993494); - - address public constant podAddress = address(0x49c486E3f4303bc11C02F952Fe5b08D0AB22D443); - - function setUp() public override virtual { - // Setup - EigenLayerUnitTestSetup.setUp(); - - // Deploy Mocks - ethPOSMock = new ETHPOSDepositMock(); - delayedWithdrawalRouterMock = new DelayedWithdrawalRouterMock(); - beaconChainOracle = new BeaconChainOracleMock(); - - // Deploy proxy contract for EPM - EmptyContract emptyContract = new EmptyContract(); - eigenPodManager = EigenPodManager( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); - - // Deploy EigenPod Implementation and beacon - podImplementation = new EigenPod( - ethPOSMock, - eigenPodManager, - GOERLI_GENESIS_TIME - ); - - eigenPodBeacon = new UpgradeableBeacon(address(podImplementation)); - - // Deploy EigenPodManager implementation - eigenPodManagerWrapper = new EigenPodManagerWrapper( - ethPOSMock, - eigenPodBeacon, - strategyManagerMock, - slasherMock, - delegationManagerMock - ); - - eigenLayerProxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy(payable(address(eigenPodManager))), - address(eigenPodManagerWrapper), - abi.encodeWithSelector( - EigenPodManager.initialize.selector, - initialOwner, - pauserRegistry, - 0 /*initialPausedStatus*/ - ) - ); - - // Below is a hack to get the eigenPod address that proofs prove against - - // Deploy Proxy same way as EigenPodManager does - eigenPod = EigenPod(payable( - Create2.deploy( - 0, - bytes32(uint256(uint160(address(podOwner)))), - // set the beacon address to the eigenPodBeacon - abi.encodePacked(beaconProxyBytecode, abi.encode(eigenPodBeacon, "")) - ))); - - // Etch the eigenPod code to the address for which proofs are generated - bytes memory code = address(eigenPod).code; - cheats.etch(podAddress, code); - eigenPod = EigenPod(payable(podAddress)); - - // Store the eigenPodBeacon address in the eigenPod beacon proxy - bytes32 beaconSlot = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; - cheats.store(address(eigenPod), beaconSlot, bytes32(uint256(uint160(address(eigenPodBeacon))))); - - // Initialize pod - eigenPod.initialize(address(podOwner)); - - // Set storage in EPM - EigenPodManagerWrapper(address(eigenPodManager)).setPodAddress(podOwner, eigenPod); - } -} - -contract EigenPod_PodManager_UnitTests_EigenPodPausing is EigenPod_PodManager_UnitTests { - /** - * 1. verifyBalanceUpdates revert when PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE set - * 2. verifyAndProcessWithdrawals revert when PAUSED_EIGENPODS_VERIFY_WITHDRAWAL set - * 3. verifyWithdrawalCredentials revert when PAUSED_EIGENPODS_VERIFY_CREDENTIALS set - */ - - /// @notice Index for flag that pauses creation of new EigenPods when set. See EigenPodManager code for details. - uint8 internal constant PAUSED_NEW_EIGENPODS = 0; - /// @notice Index for flag that pauses all withdrawal-of-restaked ETH related functionality `function *of the EigenPodManager* when set. See EigenPodManager code for details. - uint8 internal constant PAUSED_WITHDRAW_RESTAKED_ETH = 1; - - /// @notice Index for flag that pauses the deposit related functions *of the EigenPods* when set. see EigenPod code for details. - uint8 internal constant PAUSED_EIGENPODS_VERIFY_CREDENTIALS = 2; - /// @notice Index for flag that pauses the `verifyBalanceUpdate` function *of the EigenPods* when set. see EigenPod code for details. - uint8 internal constant PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE = 3; - /// @notice Index for flag that pauses the `verifyBeaconChainFullWithdrawal` function *of the EigenPods* when set. see EigenPod code for details. - uint8 internal constant PAUSED_EIGENPODS_VERIFY_WITHDRAWAL = 4; - - // function test_verifyBalanceUpdates_revert_pausedEigenVerifyBalanceUpdate() public { - // BeaconChainProofs.StateRootProof memory stateRootProofStruct; - - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // bytes[] memory proofsArray = new bytes[](1); - // uint40[] memory validatorIndices = new uint40[](1); - - // // pause the contract - // cheats.prank(address(pauser)); - // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE); - - // cheats.prank(address(podOwner)); - // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - // eigenPod.verifyBalanceUpdates(0, validatorIndices, stateRootProofStruct, proofsArray, validatorFieldsArray); - // } - - // function test_verifyAndProcessWithdrawals_revert_pausedEigenVerifyWithdrawal() public { - // BeaconChainProofs.StateRootProof memory stateRootProofStruct; - // BeaconChainProofs.WithdrawalProof[] memory withdrawalProofsArray; - - // bytes[] memory validatorFieldsProofArray = new bytes[](1); - // bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - // bytes32[][] memory withdrawalFieldsArray = new bytes32[][](1); - - // // pause the contract - // cheats.prank(address(pauser)); - // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_WITHDRAWAL); - - // cheats.prank(address(podOwner)); - // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - // eigenPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofsArray, - // validatorFieldsProofArray, - // validatorFieldsArray, - // withdrawalFieldsArray - // ); - // } - - function test_verifyWithdrawalCredentials_revert_pausedEigenVerifyCredentials() public { - BeaconChainProofs.StateRootProof memory stateRootProofStruct; - - bytes32[][] memory validatorFieldsArray = new bytes32[][](1); - bytes[] memory proofsArray = new bytes[](1); - uint40[] memory validatorIndices = new uint40[](1); - - // pause the contract - cheats.prank(address(pauser)); - eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); - - cheats.prank(address(podOwner)); - cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - eigenPod.verifyWithdrawalCredentials( - 0, - stateRootProofStruct, - validatorIndices, - proofsArray, - validatorFieldsArray - ); - } - - // function test_activateRestaking_revert_pausedEigenVerifyCredentials() public { - // // pause the contract - // cheats.prank(address(pauser)); - // eigenPodManager.pause(2 ** PAUSED_EIGENPODS_VERIFY_CREDENTIALS); - - // cheats.prank(address(podOwner)); - // cheats.expectRevert(bytes("EigenPod.onlyWhenNotPaused: index is paused in EigenPodManager")); - // eigenPod.activateRestaking(); - // } -} - -contract EigenPod_PodManager_UnitTests_EigenPod is EigenPod_PodManager_UnitTests { - /** - * @notice Tests function calls from EPM to EigenPod - * 1. Stake works when pod is deployed - * 2. Stake when pod is not deployed -> check that ethPOS deposit contract is correct for this and above test - */ - - bytes public constant pubkey = hex"88347ed1c492eedc97fc8c506a35d44d81f27a0c7a1c661b35913cfd15256c0cccbd34a83341f505c7de2983292f2cab"; - - function test_stake_podAlreadyDeployed(bytes memory signature, bytes32 depositDataRoot) public { - uint256 stakeAmount = 32e18; - - uint256 numPods = eigenPodManager.numPods(); - emit log_named_uint("numPods", numPods); - - cheats.startPrank(podOwner); - cheats.deal(podOwner, stakeAmount); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - } - - function test_stake_podNotDeployed(bytes memory signature, bytes32 depositDataRoot) public { - address newPodOwner = address(69696969696); - - uint256 stakeAmount = 32e18; - - cheats.startPrank(newPodOwner); - cheats.deal(newPodOwner, stakeAmount); - eigenPodManager.stake{value: stakeAmount}(pubkey, signature, depositDataRoot); - cheats.stopPrank(); - } -} - -contract EigenPod_PodManager_UnitTests_EigenPodManager is EigenPod_PodManager_UnitTests, ProofParsing, IEigenPodEvents { - /** - * @notice Tests function calls from EigenPod to EigenPodManager - * 1. Verify withdrawal credentials and call `recordBeaconChainETHBalanceUpdate` -> assert shares are updated - * 2. Do a full withdrawal and call `recordBeaconChainETHBalanceUpdate` -> assert shares are updated - * 3. Do a partial withdrawal and call `recordBeaconChainETHBalanceUpdate` -> assert shares are updated - * 4. Verify balance updates and call `recordBeaconChainEThBalanceUpdate` -> assert shares are updated - * 5. Withdraw restaked beacon chain ETH - */ - - using BeaconChainProofs for *; - - // Params to verify withdrawal credentials - BeaconChainProofs.StateRootProof stateRootProofStruct; - uint40[] validatorIndices; - bytes[] validatorFieldsProofs; - bytes32[][] validatorFields; - // BeaconChainProofs.BalanceUpdateProof[] balanceUpdateProof; - // BeaconChainProofs.WithdrawalProof[] withdrawalProofs; - bytes32[][] withdrawalFields; - - function test_verifyWithdrawalCredentials() public { - // Arrange: Set up conditions to verify withdrawal credentials - setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - _setWithdrawalCredentialParams(); - - // Set oracle block root and warp time - _setOracleBlockRoot(); - cheats.warp(GOERLI_GENESIS_TIME + 1 days); - uint64 oracleTimestamp = uint64(block.timestamp); - - // Save state for checks - int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - - // Act: Verify withdrawal credentials and record the balance update - cheats.prank(podOwner); - eigenPod.verifyWithdrawalCredentials( - oracleTimestamp, - stateRootProofStruct, - validatorIndices, - validatorFieldsProofs, - validatorFields - ); - - // Assert: Check that the shares are updated correctly - int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - assertTrue(updatedShares != initialShares, "Shares should be updated after verifying withdrawal credentials"); - assertEq(updatedShares, 32e18, "Shares should be 32ETH in wei after verifying withdrawal credentials"); - } - - // function test_balanceUpdate_negativeSharesDelta() public { - // // Verify withdrawal credentials - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _verifyWithdrawalCredentials(); - - // // Set JSON - // setJSON("src/test/test-data/balanceUpdateProof_balance28ETH_302913.json"); - // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // // Set proof params, oracle block root, and warp time - // _setBalanceUpdateParams(); - // _setOracleBlockRoot(); - // cheats.warp(GOERLI_GENESIS_TIME); - // uint64 oracleTimestamp = uint64(block.timestamp); - - // // Save state for checks - // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - // uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); - - // // Verify balance update - // eigenPod.verifyBalanceUpdates( - // oracleTimestamp, - // validatorIndices, - // stateRootProofStruct, - // validatorFieldsProofs, - // validatorFields - // ); - - // // Checks - // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - // assertEq(validatorInfo.restakedBalanceGwei, newValidatorBalance, "Restaked balance gwei is incorrect"); - // assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); - // int256 expectedSharesDiff = (int256(uint256(newValidatorBalance)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; - // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta should be equal to restaked balance"); - // } - - // function test_balanceUpdate_positiveSharesDelta() public { - // // Verify withdrawal credentials - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - // _verifyWithdrawalCredentials(); - - // // Set JSON - // setJSON("src/test/test-data/balanceUpdateProof_notOverCommitted_302913.json"); - // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // // Set proof params, oracle block root, and warp time - // _setBalanceUpdateParams(); - // _setOracleBlockRoot(); - // cheats.warp(GOERLI_GENESIS_TIME); - // uint64 oracleTimestamp = uint64(block.timestamp); - - // // Save state for checks - // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - // uint64 newValidatorBalance = validatorFields[0].getEffectiveBalanceGwei(); - - // // Verify balance update - // eigenPod.verifyBalanceUpdates( - // oracleTimestamp, - // validatorIndices, - // stateRootProofStruct, - // validatorFieldsProofs, - // validatorFields - // ); - - // // Checks - // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - // assertEq(validatorInfo.restakedBalanceGwei, MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR, "Restaked balance gwei should be max"); - // assertGt(updatedShares - initialShares, 0, "Shares delta should be positive"); - // assertEq(updatedShares, 32e18, "Shares should be 32ETH"); - // assertEq(newValidatorBalance, 32e9, "validator balance should be 32e9 Gwei"); - // } - - // function test_fullWithdrawal_excess32ETH() public { - // // Verify withdrawal credentials - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913_30ETHBalance.json"); - // _verifyWithdrawalCredentials(); - - // // Set JSON - // setJSON("./src/test/test-data/fullWithdrawalProof_Latest.json"); - // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // // Set proof params, block root - // _setWithdrawalProofParams(); - // _setOracleBlockRoot(); - - // // Save state for checks; deal EigenPod withdrawal router balance - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // uint64 leftOverBalanceWEI = uint64(withdrawalAmountGwei - MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR) * 1e9; - // cheats.deal(address(eigenPod), leftOverBalanceWEI); - // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - - // // Withdraw - // eigenPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofs, - // validatorFieldsProofs, - // validatorFields, - // withdrawalFields - // ); - - // // Checks - // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei should be 0"); - // assertGt(updatedShares - initialShares, 0, "Shares diff should be positive"); - // int256 expectedSharesDiff = (int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))*1e9) - initialShares; - // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); - // assertEq(updatedShares, 32e18, "Shares should be 32e18"); - // assertEq(address(delayedWithdrawalRouterMock).balance, leftOverBalanceWEI, "Incorrect amount sent to delayed withdrawal router"); - // } - - // function test_withdrawRestakedBeaconChainETH() public { - // test_fullWithdrawal_excess32ETH(); - - // // Deal eigenPod balance - max restaked balance - // cheats.deal(address(eigenPod), 32 ether); - - // cheats.startPrank(address(delegationManagerMock)); - // vm.expectEmit(true, true, true, true); - // emit RestakedBeaconChainETHWithdrawn(podOwner, 32 ether); - // eigenPodManager.withdrawSharesAsTokens( - // podOwner, - // podOwner, - // uint256(eigenPodManager.podOwnerShares(podOwner)) - // ); - // cheats.stopPrank(); - - // // Checks - // assertEq(address(podOwner).balance, 32 ether, "EigenPod balance should be 0"); - // assertEq(address(eigenPod).balance, 0, "EigenPod balance should be 0"); - // assertEq(eigenPod.withdrawableRestakedExecutionLayerGwei(), 0, "Restaked execution layer gwei should be 0"); - // } - - // function test_fullWithdrawal_less32ETH() public { - // // Verify withdrawal credentials - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _verifyWithdrawalCredentials(); - - // // Set JSON - // setJSON("src/test/test-data/fullWithdrawalProof_Latest_28ETH.json"); - // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // // Set proof params, block root - // _setWithdrawalProofParams(); - // _setOracleBlockRoot(); - - // // Save State - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - - // // Withdraw - // eigenPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofs, - // validatorFieldsProofs, - // validatorFields, - // withdrawalFields - // ); - - // // Checks - // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - // assertEq(validatorInfo.restakedBalanceGwei, 0, "Restaked balance gwei is incorrect"); - // assertLt(updatedShares - initialShares, 0, "Shares delta should be negative"); - // int256 expectedSharesDiff = (int256(uint256(withdrawalAmountGwei)) - int256(uint256(MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR))) * 1e9; - // assertEq(updatedShares - initialShares, expectedSharesDiff, "Shares delta incorrect"); - // } - - // function test_partialWithdrawal() public { - // // Set JSON & params - // setJSON("./src/test/test-data/withdrawal_credential_proof_302913.json"); - // _verifyWithdrawalCredentials(); - - // // Set JSON - // setJSON("./src/test/test-data/partialWithdrawalProof_Latest.json"); - // bytes32 validatorPubkeyHash = validatorFields[0].getPubkeyHash(); - - // // Set proof params, block root - // _setWithdrawalProofParams(); - // _setOracleBlockRoot(); - - // // Assert that partial withdrawal code path will be tested - // assertLt(withdrawalProofs[0].getWithdrawalEpoch(), validatorFields[0].getWithdrawableEpoch(), "Withdrawal epoch should be less than the withdrawable epoch"); - - // // Save state for checks; deal EigenPod withdrawal router balance - // uint64 withdrawalAmountGwei = Endian.fromLittleEndianUint64( - // withdrawalFields[0][BeaconChainProofs.WITHDRAWAL_VALIDATOR_AMOUNT_INDEX] - // ); - // cheats.deal(address(eigenPod), withdrawalAmountGwei * 1e9); // deal full withdrawal amount since it's a partial withdrawal - // uint64 initialRestakedBalance = (eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash)).restakedBalanceGwei; - // int256 initialShares = eigenPodManager.podOwnerShares(podOwner); - - // // Withdraw - // eigenPod.verifyAndProcessWithdrawals( - // 0, - // stateRootProofStruct, - // withdrawalProofs, - // validatorFieldsProofs, - // validatorFields, - // withdrawalFields - // ); - - // // Checks - // int256 updatedShares = eigenPodManager.podOwnerShares(podOwner); - // IEigenPod.ValidatorInfo memory validatorInfo = eigenPod.validatorPubkeyHashToInfo(validatorPubkeyHash); - // assertEq(validatorInfo.restakedBalanceGwei, initialRestakedBalance, "Restaked balance gwei should be unchanged"); - // assertEq(updatedShares - initialShares, 0, "Shares diff should be 0"); - // assertEq(address(delayedWithdrawalRouterMock).balance, withdrawalAmountGwei * 1e9, "Incorrect amount sent to delayed withdrawal router"); - // } - - // Helper Functions - function _getStateRootProof() internal returns (BeaconChainProofs.StateRootProof memory) { - return BeaconChainProofs.StateRootProof(getBeaconStateRoot(), getStateRootProof()); - } - - function _setOracleBlockRoot() internal { - bytes32 latestBlockRoot = getLatestBlockRoot(); - //set beaconStateRoot - beaconChainOracle.setOracleBlockRootAtTimestamp(latestBlockRoot); - } - - function _verifyWithdrawalCredentials() internal { - _setWithdrawalCredentialParams(); - - // Set oracle block root and warp time - uint64 oracleTimestamp = 0; - _setOracleBlockRoot(); - cheats.warp(oracleTimestamp+=1); - - // Act: Verify withdrawal credentials and record the balance update - cheats.prank(podOwner); - eigenPod.verifyWithdrawalCredentials( - oracleTimestamp, - stateRootProofStruct, - validatorIndices, - validatorFieldsProofs, - validatorFields - ); - } - - function _setWithdrawalCredentialParams() internal { - // Reset arrays - delete validatorIndices; - delete validatorFields; - delete validatorFieldsProofs; - - // Set state proof struct - stateRootProofStruct = _getStateRootProof(); - - // Set validator indices - uint40 validatorIndex = uint40(getValidatorIndex()); - validatorIndices.push(validatorIndex); - - // Set validatorFieldsArray - validatorFields.push(getValidatorFields()); - - // Set validator fields proof - validatorFieldsProofs.push(getWithdrawalCredentialProof()); // Validator fields are proven here - } - - // function _setBalanceUpdateParams() internal { - // // Reset arrays - // delete validatorIndices; - // delete validatorFields; - // delete validatorFieldsProofs; - - // // Set state proof struct - // stateRootProofStruct = _getStateRootProof(); - - // // Set validator indices - // uint40 validatorIndex = uint40(getValidatorIndex()); - // validatorIndices.push(validatorIndex); - - // // Set validatorFieldsArray - // validatorFields.push(getValidatorFields()); - - // // Set validator fields proof - // validatorFieldsProofs.push(abi.encodePacked(getBalanceUpdateProof())); // Validator fields are proven here - // } - - // function _setWithdrawalProofParams() internal { - // // Reset arrays - // delete validatorFields; - // delete validatorFieldsProofs; - // delete withdrawalFields; - // delete withdrawalProofs; - - // // Set state proof struct - // stateRootProofStruct = _getStateRootProof(); - - // // Set validatorFields - // validatorFields.push(getValidatorFields()); - - // // Set validator fields proof - // validatorFieldsProofs.push(abi.encodePacked(getValidatorProof())); - - // // Set withdrawal fields - // withdrawalFields.push(getWithdrawalFields()); - - // // Set withdrawal proofs - // withdrawalProofs.push(_getWithdrawalProof()); - // } - - // function _getBalanceUpdateProof() internal returns (BeaconChainProofs.BalanceUpdateProof memory) { - // bytes32 balanceRoot = getBalanceRoot(); - // BeaconChainProofs.BalanceUpdateProof memory proofs = BeaconChainProofs.BalanceUpdateProof( - // abi.encodePacked(getValidatorBalanceProof()), - // abi.encodePacked(getWithdrawalCredentialProof()), //technically this is to verify validator pubkey in the validator fields, but the WC proof is effectively the same so we use it here again. - // balanceRoot - // ); - // return proofs; - // } - - /// @notice this function just generates a valid proof so that we can test other functionalities of the withdrawal flow - // function _getWithdrawalProof() internal returns (BeaconChainProofs.WithdrawalProof memory) { - // { - // bytes32 blockRoot = getBlockRoot(); - // bytes32 slotRoot = getSlotRoot(); - // bytes32 timestampRoot = getTimestampRoot(); - // bytes32 executionPayloadRoot = getExecutionPayloadRoot(); - - // return - // BeaconChainProofs.WithdrawalProof( - // abi.encodePacked(getWithdrawalProofCapella()), - // abi.encodePacked(getSlotProof()), - // abi.encodePacked(getExecutionPayloadProof()), - // abi.encodePacked(getTimestampProofCapella()), - // abi.encodePacked(getHistoricalSummaryProof()), - // uint64(getBlockRootIndex()), - // uint64(getHistoricalSummaryIndex()), - // uint64(getWithdrawalIndex()), - // blockRoot, - // slotRoot, - // timestampRoot, - // executionPayloadRoot - // ); - // } - // } -} - diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 064ab3064..255facbc3 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -8,7 +8,6 @@ import "src/contracts/pods/EigenPod.sol"; import "src/contracts/pods/EigenPodPausingConstants.sol"; import "src/test/mocks/ETHDepositMock.sol"; -import "src/test/mocks/DelayedWithdrawalRouterMock.sol"; import "src/test/mocks/ERC20Mock.sol"; import "src/test/harnesses/EigenPodHarness.sol"; import "src/test/utils/ProofParsing.sol"; @@ -954,7 +953,7 @@ contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests { /// @notice revert when startCheckpoint is not called by pod owner function testFuzz_revert_callerIsNotPodOwner(uint256 rand, address invalidCaller) public { - (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); (uint40[] memory validators,) = staker.startValidators(); staker.verifyWithdrawalCredentials(validators); @@ -973,7 +972,7 @@ contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests { function testFuzz_revert_startCheckpointPaused(uint256 rand) public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); - (uint40[] memory validators,) = staker.startValidators(); + staker.startValidators(); cheats.prank(pauser); eigenPodManagerMock.pause(2 ** PAUSED_START_CHECKPOINT); @@ -1040,7 +1039,7 @@ contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); _setPodHasNotRestaked(staker); - (uint40[] memory validators,) = staker.startValidators(); + staker.startValidators(); beaconChain.advanceEpoch(); assertFalse( From b8be488d26dc2776bdbb47474626325d24b2134a Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 21 Jun 2024 20:18:11 +0000 Subject: [PATCH 28/85] feat: remove staleness timing window * chore: update IEigenPod interface with updated comments --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- src/contracts/interfaces/IEigenPod.sol | 29 ++++- src/contracts/pods/EigenPod.sol | 54 ++++++--- src/test/unit/EigenPodUnit.t.sol | 107 +++++++----------- 12 files changed, 113 insertions(+), 95 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 2b3c65911..60c3889c4 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220a2020ef684696852d4491824c67f0ea1865ab16ab6e0ab09f8b82050cfd82a3964736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220eab8987739ab3fc1507e292834995e5e9d5e07aa633cb4e409b42ab40c12ed3764736f6c634300080c0033", } // AVSDirectoryABI 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 1516b0657..a941fadce 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,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\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212201b096c99c4305b1dcc9e8eb1b08e356ac0c74d42cebda2c642e7c122705206b264736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220fb4eae5d392329a7b7ebba81e035ea073c49f1dbe1024cd543da4599c25d6cde64736f6c634300080c0033", } // DelegationManagerABI 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 0d61cf6ab..0ab86eb5e 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -73,7 +73,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b50604051620049b2380380620049b2833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c0516147946200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a6101528181610da701528181610f660152818161106b0152818161130b01528181611757015281816119000152612f9a015260008181610483015261113601526147946000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613adc565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b9a565b610a1e565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c68565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cc4565b610e11565b6040516101d99190613d3d565b34801561041957600080fd5b5061042d610428366004613d4b565b610e76565b6040516101d99190613d64565b34801561044657600080fd5b50610400610455366004613d4b565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613dba565b610f23565b6101a36104d3366004613dd7565b611060565b3480156104e457600080fd5b5061042d6104f3366004613cc4565b61120d565b34801561050457600080fd5b506101a3610513366004613e6a565b611300565b34801561052457600080fd5b506101a3610533366004613e96565b61153d565b34801561054457600080fd5b506101a3610553366004613f87565b611714565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614058565b6118e7565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140c0565b1561067e5760405162461bcd60e51b8152600401610675906140dd565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140c0565b156107275760405162461bcd60e51b8152600401610675906140dd565b600061076d610736858061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613d05565b60028111156107ed576107ed613d05565b8152505090506212750081604001516001600160401b031661080f9190614199565b876001600160401b03161161088c5760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f722062616c616e6365206973206e6f74207374616c6520796574006064820152608401610675565b6001816060015160028111156108a4576108a4613d05565b1461090e5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61095261091b868061413a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5e92505050565b6109d65760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109e86109e288611d88565b87611f3d565b610a0b86356109f7878061413a565b610a0460208a018a6141b1565b8651612098565b610a1560006122af565b50505050505050565b6033546001600160a01b03163314610a485760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906140c0565b15610af15760405162461bcd60e51b8152600401610675906140dd565b603454600160401b900460ff16610b705760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7e57508382145b610c0e5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c415750603a546001600160401b03600160401b9091048116908a16115b610cc85760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cda610cd48a611d88565b89611f3d565b6000805b87811015610d7d57610d5f8a358a8a84818110610cfd57610cfd61423f565b9050602002016020810190610d129190614255565b898985818110610d2457610d2461423f565b9050602002810190610d3691906141b1565b898987818110610d4857610d4861423f565b9050602002810190610d5a919061413a565b612531565b610d699083614199565b915080610d758161427c565b915050610cde565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610ded57600080fd5b505af1158015610e01573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e5384848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e9e6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610f0957610f09613d05565b6002811115610f1a57610f1a613d05565b90525092915050565b6033546001600160a01b03163314610f4d5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd991906140c0565b15610ff65760405162461bcd60e51b8152600401610675906140dd565b610fff826122af565b603454600160401b900460ff1661105c576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110a85760405162461bcd60e51b815260040161067590614297565b346801bc16d674ec800000146111345760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611177612b78565b8888886040518863ffffffff1660e01b815260040161119b9695949392919061436d565b6000604051808303818588803b1580156111b457600080fd5b505af11580156111c8573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111fe9291906143bc565b60405180910390a15050505050565b6112356040805160808101825260008082526020820181905291810182905290606082015290565b6036600061127885858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7e92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112e5576112e5613d05565b60028111156112f6576112f6613d05565b9052509392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113485760405162461bcd60e51b815260040161067590614297565b611356633b9aca00826143e6565b156113e05760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113f0633b9aca00836143fa565b6034549091506001600160401b0390811690821611156114a95760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114c79084906001600160401b031661440e565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161152691815260200190565b60405180910390a26115388383612bbd565b505050565b600054610100900460ff161580801561155d5750600054600160ff909116105b806115775750303b158015611577575060005460ff166001145b6115da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115fd576000805461ff0019166101001790555b6001600160a01b0382166116705760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a2801561105c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b0316331461173e5760405162461bcd60e51b8152600401610675906141f7565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ca91906140c0565b156117e75760405162461bcd60e51b8152600401610675906140dd565b82518451146118725760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118e0576118ce838583815181106118945761189461423f565b60200260200101518784815181106118ae576118ae61423f565b60200260200101516001600160a01b0316612bc79092919063ffffffff16565b806118d88161427c565b915050611875565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561194f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197391906140c0565b156119905760405162461bcd60e51b8152600401610675906140dd565b603a54600160401b90046001600160401b031680611a3c5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a8c9087612c19565b6000805b85811015611ce05736878783818110611aab57611aab61423f565b9050602002810190611abd9190614436565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2e57611b2e613d05565b6002811115611b3f57611b3f613d05565b9052509050600181606001516002811115611b5c57611b5c613d05565b14611b68575050611cce565b856001600160401b031681604001516001600160401b031610611b8c575050611cce565b600080611b9c83898e3587612d95565b602089018051929450909250611bb182614456565b62ffffff16905250606087018051839190611bcd908390614475565b600f0b905250611bdd81876144c4565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c8257611c82613d05565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611cd88161427c565b915050611a90565b506001600160401b038084166000908152603b6020526040812080548493919291611d0d918591166144c4565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a1582612eb7565b600081600081518110611d4f57611d4f61423f565b60200260200101519050919050565b600081600381518110611d7357611d7361423f565b60200260200101516000801b14159050919050565b6000611d97611fff600c6144ef565b611daa6001600160401b0384164261450e565b10611e145760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e5c91614525565b600060405180830381855afa9150503d8060008114611e97576040519150601f19603f3d011682016040523d82523d6000602084013e611e9c565b606091505b5091509150818015611eaf575060008151115b611f215760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f359190614537565b949350505050565b611f49600360206144ef565b611f5660208301836141b1565b905014611fcb5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61201b611fdb60208301836141b1565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036130be565b61105c5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121135760405162461bcd60e51b815260206004820152604e602482015260008051602061473f83398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b600561212160286001614199565b61212b9190614199565b6121369060206144ef565b82146121a45760405162461bcd60e51b8152602060048201526043602482015260008051602061473f83398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121e28686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130d692505050565b9050600064ffffffffff83166121fa60286001614199565b600b901b17905061224585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506130be565b6122a55760405162461bcd60e51b815260206004820152603d602482015260008051602061473f83398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123505760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123d55760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123f2633b9aca00476143fa565b6123fc919061440e565b905081801561241257506001600160401b038116155b156124855760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061249b42611d88565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124f681612eb7565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612570848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d3a92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125df576125df613d05565b60028111156125f0576125f0613d05565b905250905060008160600151600281111561260d5761260d613d05565b146126b05760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126f686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061338392505050565b6001600160401b0316146127805760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b612788612b78565b61279190614550565b6127cd8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133a892505050565b1461284e5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b600061288c8686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133bd92505050565b905061289c8a87878b8b8e612098565b603980549060006128ac8361427c565b9091555050603a54600090600160401b90046001600160401b0316156128e457603a54600160401b90046001600160401b03166128f1565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129c7576129c7613d05565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a6f633b9aca006001600160401b0384166144ef565b9b9a5050505050505050505050565b60008151603014612b075760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1e908490600090602001614574565b60408051601f1981840301815290829052612b3891614525565b602060405180830381855afa158015612b55573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e709190614537565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b61105c82826133d5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115389084906134ee565b612c2560056003614199565b612c309060206144ef565b612c3d60208301836141b1565b905014612cc05760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612d11612cd260208401846141b1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846130be565b6115385760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612dad8784886135c0565b9050816001600160401b0316816001600160401b031614612e2757612dd28183613737565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612eab5760398054906000612e55836145a3565b9091555050600260608a0152612e6a856145ba565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff1661303e576000633b9aca00826060015183604001516001600160401b0316612ee99190614475565b600f0b612ef691906145e1565b6040830151603480549293509091600090612f1b9084906001600160401b03166144c4565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612fe057600080fd5b505af1158015612ff4573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836130cc86858561374f565b1495945050505050565b600080600283516130e791906143fa565b90506000816001600160401b0381111561310357613103613eb3565b60405190808252806020026020018201604052801561312c578160200160208202803683370190505b50905060005b828110156132335760028561314783836144ef565b815181106131575761315761423f565b60200260200101518683600261316d91906144ef565b613178906001614199565b815181106131885761318861423f565b60200260200101516040516020016131aa929190918252602082015260400190565b60408051601f19818403018152908290526131c491614525565b602060405180830381855afa1580156131e1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132049190614537565b8282815181106132165761321661423f565b60209081029190910101528061322b8161427c565b915050613132565b5061323f6002836143fa565b91505b811561335f5760005b8281101561334c5760028261326083836144ef565b815181106132705761327061423f565b60200260200101518383600261328691906144ef565b613291906001614199565b815181106132a1576132a161423f565b60200260200101516040516020016132c3929190918252602082015260400190565b60408051601f19818403018152908290526132dd91614525565b602060405180830381855afa1580156132fa573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061331d9190614537565b82828151811061332f5761332f61423f565b6020908102919091010152806133448161427c565b91505061324b565b506133586002836143fa565b9150613242565b806000815181106133725761337261423f565b602002602001015192505050919050565b6000610e708260068151811061339b5761339b61423f565b602002602001015161389b565b600081600181518110611d4f57611d4f61423f565b6000610e708260028151811061339b5761339b61423f565b804710156134255760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613472576040519150601f19603f3d011682016040523d82523d6000602084013e613477565b606091505b50509050806115385760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b6000613543826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139029092919063ffffffff16565b805190915015611538578080602001905181019061356191906140c0565b6115385760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135ce60266001614199565b6135d99060206144ef565b6135e660408401846141b1565b9050146136575760405162461bcd60e51b81526020600482015260446024820181905260008051602061473f833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b6000613664600485614666565b64ffffffffff1690506136be61367d60408501856141b1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846130be565b61371e5760405162461bcd60e51b815260206004820152603e602482015260008051602061473f83398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b61372c836020013585613911565b9150505b9392505050565b60006137306001600160401b0380841690851661468a565b6000835160001415801561376e57506020845161376c91906143e6565b155b6137fd5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b85518111613891576138216002856143e6565b613854578151600052808601516020526020826040600060026107d05a03fa61384957600080fd5b60028404935061387f565b8086015160005281516020526020826040600060026107d05a03fa61387857600080fd5b6002840493505b61388a602082614199565b905061380e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f35848460008561393e565b60008061391f6004846146da565b61392a9060406146fe565b64ffffffffff169050611f3584821b61389b565b60608247101561399f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139f65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b03168587604051613a129190614525565b60006040518083038185875af1925050503d8060008114613a4f576040519150601f19603f3d011682016040523d82523d6000602084013e613a54565b606091505b5091509150613a64828286613a6f565b979650505050505050565b60608315613a7e575081613730565b825115613a8e5782518084602001fd5b8160405162461bcd60e51b8152600401610675919061472b565b80356001600160401b0381168114613abf57600080fd5b919050565b600060408284031215613ad657600080fd5b50919050565b600080600060608486031215613af157600080fd5b613afa84613aa8565b925060208401356001600160401b0380821115613b1657600080fd5b613b2287838801613ac4565b93506040860135915080821115613b3857600080fd5b50613b4586828701613ac4565b9150509250925092565b60008083601f840112613b6157600080fd5b5081356001600160401b03811115613b7857600080fd5b6020830191508360208260051b8501011115613b9357600080fd5b9250929050565b60008060008060008060008060a0898b031215613bb657600080fd5b613bbf89613aa8565b975060208901356001600160401b0380821115613bdb57600080fd5b613be78c838d01613ac4565b985060408b0135915080821115613bfd57600080fd5b613c098c838d01613b4f565b909850965060608b0135915080821115613c2257600080fd5b613c2e8c838d01613b4f565b909650945060808b0135915080821115613c4757600080fd5b50613c548b828c01613b4f565b999c989b5096995094979396929594505050565b600060208284031215613c7a57600080fd5b61373082613aa8565b60008083601f840112613c9557600080fd5b5081356001600160401b03811115613cac57600080fd5b602083019150836020828501011115613b9357600080fd5b60008060208385031215613cd757600080fd5b82356001600160401b03811115613ced57600080fd5b613cf985828601613c83565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d3957634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e708284613d1b565b600060208284031215613d5d57600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613da56060840182613d1b565b5092915050565b80151581146130bb57600080fd5b600060208284031215613dcc57600080fd5b813561373081613dac565b600080600080600060608688031215613def57600080fd5b85356001600160401b0380821115613e0657600080fd5b613e1289838a01613c83565b90975095506020880135915080821115613e2b57600080fd5b50613e3888828901613c83565b96999598509660400135949350505050565b6001600160a01b03811681146130bb57600080fd5b8035613abf81613e4a565b60008060408385031215613e7d57600080fd5b8235613e8881613e4a565b946020939093013593505050565b600060208284031215613ea857600080fd5b813561373081613e4a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613ef157613ef1613eb3565b604052919050565b60006001600160401b03821115613f1257613f12613eb3565b5060051b60200190565b600082601f830112613f2d57600080fd5b81356020613f42613f3d83613ef9565b613ec9565b82815260059290921b84018101918181019086841115613f6157600080fd5b8286015b84811015613f7c5780358352918301918301613f65565b509695505050505050565b600080600060608486031215613f9c57600080fd5b83356001600160401b0380821115613fb357600080fd5b818601915086601f830112613fc757600080fd5b81356020613fd7613f3d83613ef9565b82815260059290921b8401810191818101908a841115613ff657600080fd5b948201945b8386101561401d57853561400e81613e4a565b82529482019490820190613ffb565b9750508701359250508082111561403357600080fd5b5061404086828701613f1c565b92505061404f60408501613e5f565b90509250925092565b60008060006040848603121561406d57600080fd5b83356001600160401b038082111561408457600080fd5b61409087838801613ac4565b945060208601359150808211156140a657600080fd5b506140b386828701613b4f565b9497909650939450505050565b6000602082840312156140d257600080fd5b815161373081613dac565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261415157600080fd5b8301803591506001600160401b0382111561416b57600080fd5b6020019150600581901b3603821315613b9357600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156141ac576141ac614183565b500190565b6000808335601e198436030181126141c857600080fd5b8301803591506001600160401b038211156141e257600080fd5b602001915036819003821315613b9357600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561426757600080fd5b813564ffffffffff8116811461373057600080fd5b600060001982141561429057614290614183565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561432c578181015183820152602001614314565b8381111561433b576000848401525b50505050565b60008151808452614359816020860160208601614311565b601f01601f19169290920160200192915050565b60808152600061438160808301888a6142e8565b82810360208401526143938188614341565b905082810360408401526143a88186886142e8565b915050826060830152979650505050505050565b602081526000611f356020830184866142e8565b634e487b7160e01b600052601260045260246000fd5b6000826143f5576143f56143d0565b500690565b600082614409576144096143d0565b500490565b60006001600160401b038381169083168181101561442e5761442e614183565b039392505050565b60008235605e1983360301811261444c57600080fd5b9190910192915050565b600062ffffff82168061446b5761446b614183565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561449f5761449f614183565b8260016001607f1b03190382128116156144bb576144bb614183565b50019392505050565b60006001600160401b038083168185168083038211156144e6576144e6614183565b01949350505050565b600081600019048311821515161561450957614509614183565b500290565b60008282101561452057614520614183565b500390565b6000825161444c818460208701614311565b60006020828403121561454957600080fd5b5051919050565b80516020808301519190811015613ad65760001960209190910360031b1b16919050565b60008351614586818460208801614311565b6001600160801b0319939093169190920190815260100192915050565b6000816145b2576145b2614183565b506000190190565b600081600f0b60016001607f1b03198114156145d8576145d8614183565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561460757614607614183565b600160ff1b600087128281168783058912161561462657614626614183565b6000871292508782058712848416161561464257614642614183565b8785058712818416161561465857614658614183565b505050929093029392505050565b600064ffffffffff8084168061467e5761467e6143d0565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156146b5576146b5614183565b8160016001607f1b030183138116156146d0576146d0614183565b5090039392505050565b600064ffffffffff808416806146f2576146f26143d0565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561472257614722614183565b02949350505050565b602081526000613730602083018461434156fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa26469706673582212202a1f77ee477c1101b3918b3a4963ac2ee99a0a76b13e4b70e9b4fea6d2d0378a64736f6c634300080c0033", + Bin: "0x60e06040523480156200001157600080fd5b506040516200499c3803806200499c833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c05161477e6200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a5501528181610d9b01528181610f5a0152818161105f015281816112ff0152818161174b015281816118f4015261309d015260008181610483015261112a015261477e6000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613ac6565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b84565b610a12565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c52565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cae565b610e05565b6040516101d99190613d27565b34801561041957600080fd5b5061042d610428366004613d35565b610e6a565b6040516101d99190613d4e565b34801561044657600080fd5b50610400610455366004613d35565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613da4565b610f17565b6101a36104d3366004613dc1565b611054565b3480156104e457600080fd5b5061042d6104f3366004613cae565b611201565b34801561050457600080fd5b506101a3610513366004613e54565b6112f4565b34801561052457600080fd5b506101a3610533366004613e80565b611531565b34801561054457600080fd5b506101a3610553366004613f71565b611708565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614042565b6118db565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140aa565b1561067e5760405162461bcd60e51b8152600401610675906140c7565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140aa565b156107275760405162461bcd60e51b8152600401610675906140c7565b600061076d6107368580614124565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2e92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613cef565b60028111156107ed576107ed613cef565b81525050905080604001516001600160401b0316876001600160401b031611610880576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e7665726966795374616c6542616c616e63653a2070726f60448201527f6f66206973206f6c646572207468616e206c61737420636865636b706f696e746064820152608401610675565b60018160600151600281111561089857610898613cef565b146109025760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61094661090f8680614124565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5292505050565b6109ca5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109dc6109d688611d7c565b87611f31565b6109ff86356109eb8780614124565b6109f860208a018a61416d565b865161208c565b610a0960006122a3565b50505050505050565b6033546001600160a01b03163314610a3c5760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610aa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac891906140aa565b15610ae55760405162461bcd60e51b8152600401610675906140c7565b603454600160401b900460ff16610b645760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7257508382145b610c025760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c355750603a546001600160401b03600160401b9091048116908a16115b610cbc5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cce610cc88a611d7c565b89611f31565b6000805b87811015610d7157610d538a358a8a84818110610cf157610cf16141fb565b9050602002016020810190610d069190614211565b898985818110610d1857610d186141fb565b9050602002810190610d2a919061416d565b898987818110610d3c57610d3c6141fb565b9050602002810190610d4e9190614124565b612525565b610d5d908361424e565b915080610d6981614266565b915050610cd2565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e4784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7292505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e926040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610efd57610efd613cef565b6002811115610f0e57610f0e613cef565b90525092915050565b6033546001600160a01b03163314610f415760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906140aa565b15610fea5760405162461bcd60e51b8152600401610675906140c7565b610ff3826122a3565b603454600160401b900460ff16611050576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461109c5760405162461bcd60e51b815260040161067590614281565b346801bc16d674ec800000146111285760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec800000878761116b612b6c565b8888886040518863ffffffff1660e01b815260040161118f96959493929190614357565b6000604051808303818588803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111f29291906143a6565b60405180910390a15050505050565b6112296040805160808101825260008082526020820181905291810182905290606082015290565b6036600061126c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7292505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112d9576112d9613cef565b60028111156112ea576112ea613cef565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461133c5760405162461bcd60e51b815260040161067590614281565b61134a633b9aca00826143d0565b156113d45760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113e4633b9aca00836143e4565b6034549091506001600160401b03908116908216111561149d5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114bb9084906001600160401b03166143f8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161151a91815260200190565b60405180910390a261152c8383612bb1565b505050565b600054610100900460ff16158080156115515750600054600160ff909116105b8061156b5750303b15801561156b575060005460ff166001145b6115ce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115f1576000805461ff0019166101001790555b6001600160a01b0382166116645760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611050576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146117325760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be91906140aa565b156117db5760405162461bcd60e51b8152600401610675906140c7565b82518451146118665760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118d4576118c283858381518110611888576118886141fb565b60200260200101518784815181106118a2576118a26141fb565b60200260200101516001600160a01b0316612cca9092919063ffffffff16565b806118cc81614266565b915050611869565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196791906140aa565b156119845760405162461bcd60e51b8152600401610675906140c7565b603a54600160401b90046001600160401b031680611a305760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a809087612d1c565b6000805b85811015611cd45736878783818110611a9f57611a9f6141fb565b9050602002810190611ab19190614420565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2257611b22613cef565b6002811115611b3357611b33613cef565b9052509050600181606001516002811115611b5057611b50613cef565b14611b5c575050611cc2565b856001600160401b031681604001516001600160401b031610611b80575050611cc2565b600080611b9083898e3587612e98565b602089018051929450909250611ba582614440565b62ffffff16905250606087018051839190611bc190839061445f565b600f0b905250611bd181876144ae565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c7657611c76613cef565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611ccc81614266565b915050611a84565b506001600160401b038084166000908152603b6020526040812080548493919291611d01918591166144ae565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a0982612fba565b600081600081518110611d4357611d436141fb565b60200260200101519050919050565b600081600381518110611d6757611d676141fb565b60200260200101516000801b14159050919050565b6000611d8b611fff600c6144d9565b611d9e6001600160401b038416426144f8565b10611e085760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e509161450f565b600060405180830381855afa9150503d8060008114611e8b576040519150601f19603f3d011682016040523d82523d6000602084013e611e90565b606091505b5091509150818015611ea3575060008151115b611f155760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f299190614521565b949350505050565b611f3d600360206144d9565b611f4a602083018361416d565b905014611fbf5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61200f611fcf602083018361416d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036131c1565b6110505760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121075760405162461bcd60e51b815260206004820152604e602482015260008051602061472983398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b60056121156028600161424e565b61211f919061424e565b61212a9060206144d9565b82146121985760405162461bcd60e51b8152602060048201526043602482015260008051602061472983398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121d68686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131d992505050565b9050600064ffffffffff83166121ee6028600161424e565b600b901b17905061223985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506131c1565b6122995760405162461bcd60e51b815260206004820152603d602482015260008051602061472983398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123445760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123c95760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123e6633b9aca00476143e4565b6123f091906143f8565b905081801561240657506001600160401b038116155b156124795760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061248f42611d7c565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124ea81612fba565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612564848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2e92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125d3576125d3613cef565b60028111156125e4576125e4613cef565b905250905060008160600151600281111561260157612601613cef565b146126a45760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126ea86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061348692505050565b6001600160401b0316146127745760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b61277c612b6c565b6127859061453a565b6127c18686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134ab92505050565b146128425760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006128808686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134c092505050565b90506128908a87878b8b8e61208c565b603980549060006128a083614266565b9091555050603a54600090600160401b90046001600160401b0316156128d857603a54600160401b90046001600160401b03166128e5565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129bb576129bb613cef565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a63633b9aca006001600160401b0384166144d9565b9b9a5050505050505050505050565b60008151603014612afb5760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1290849060009060200161455e565b60408051601f1981840301815290829052612b2c9161450f565b602060405180830381855afa158015612b49573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e649190614521565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b80471015612c015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c4e576040519150601f19603f3d011682016040523d82523d6000602084013e612c53565b606091505b505090508061152c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261152c9084906134d8565b612d286005600361424e565b612d339060206144d9565b612d40602083018361416d565b905014612dc35760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612e14612dd5602084018461416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846131c1565b61152c5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612eb08784886135aa565b9050816001600160401b0316816001600160401b031614612f2a57612ed58183613721565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612fae5760398054906000612f588361458d565b9091555050600260608a0152612f6d856145a4565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff16613141576000633b9aca00826060015183604001516001600160401b0316612fec919061445f565b600f0b612ff991906145cb565b604083015160348054929350909160009061301e9084906001600160401b03166144ae565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b1580156130e357600080fd5b505af11580156130f7573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836131cf868585613739565b1495945050505050565b600080600283516131ea91906143e4565b90506000816001600160401b0381111561320657613206613e9d565b60405190808252806020026020018201604052801561322f578160200160208202803683370190505b50905060005b828110156133365760028561324a83836144d9565b8151811061325a5761325a6141fb565b60200260200101518683600261327091906144d9565b61327b90600161424e565b8151811061328b5761328b6141fb565b60200260200101516040516020016132ad929190918252602082015260400190565b60408051601f19818403018152908290526132c79161450f565b602060405180830381855afa1580156132e4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906133079190614521565b828281518110613319576133196141fb565b60209081029190910101528061332e81614266565b915050613235565b506133426002836143e4565b91505b81156134625760005b8281101561344f5760028261336383836144d9565b81518110613373576133736141fb565b60200260200101518383600261338991906144d9565b61339490600161424e565b815181106133a4576133a46141fb565b60200260200101516040516020016133c6929190918252602082015260400190565b60408051601f19818403018152908290526133e09161450f565b602060405180830381855afa1580156133fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134209190614521565b828281518110613432576134326141fb565b60209081029190910101528061344781614266565b91505061334e565b5061345b6002836143e4565b9150613345565b80600081518110613475576134756141fb565b602002602001015192505050919050565b6000610e648260068151811061349e5761349e6141fb565b6020026020010151613885565b600081600181518110611d4357611d436141fb565b6000610e648260028151811061349e5761349e6141fb565b600061352d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138ec9092919063ffffffff16565b80519091501561152c578080602001905181019061354b91906140aa565b61152c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135b86026600161424e565b6135c39060206144d9565b6135d0604084018461416d565b9050146136415760405162461bcd60e51b815260206004820152604460248201819052600080516020614729833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b600061364e600485614650565b64ffffffffff1690506136a8613667604085018561416d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846131c1565b6137085760405162461bcd60e51b815260206004820152603e602482015260008051602061472983398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b6137168360200135856138fb565b9150505b9392505050565b600061371a6001600160401b03808416908516614674565b6000835160001415801561375857506020845161375691906143d0565b155b6137e75760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b8551811161387b5761380b6002856143d0565b61383e578151600052808601516020526020826040600060026107d05a03fa61383357600080fd5b600284049350613869565b8086015160005281516020526020826040600060026107d05a03fa61386257600080fd5b6002840493505b61387460208261424e565b90506137f8565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f298484600085613928565b6000806139096004846146c4565b6139149060406146e8565b64ffffffffff169050611f2984821b613885565b6060824710156139895760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139e05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b031685876040516139fc919061450f565b60006040518083038185875af1925050503d8060008114613a39576040519150601f19603f3d011682016040523d82523d6000602084013e613a3e565b606091505b5091509150613a4e828286613a59565b979650505050505050565b60608315613a6857508161371a565b825115613a785782518084602001fd5b8160405162461bcd60e51b81526004016106759190614715565b80356001600160401b0381168114613aa957600080fd5b919050565b600060408284031215613ac057600080fd5b50919050565b600080600060608486031215613adb57600080fd5b613ae484613a92565b925060208401356001600160401b0380821115613b0057600080fd5b613b0c87838801613aae565b93506040860135915080821115613b2257600080fd5b50613b2f86828701613aae565b9150509250925092565b60008083601f840112613b4b57600080fd5b5081356001600160401b03811115613b6257600080fd5b6020830191508360208260051b8501011115613b7d57600080fd5b9250929050565b60008060008060008060008060a0898b031215613ba057600080fd5b613ba989613a92565b975060208901356001600160401b0380821115613bc557600080fd5b613bd18c838d01613aae565b985060408b0135915080821115613be757600080fd5b613bf38c838d01613b39565b909850965060608b0135915080821115613c0c57600080fd5b613c188c838d01613b39565b909650945060808b0135915080821115613c3157600080fd5b50613c3e8b828c01613b39565b999c989b5096995094979396929594505050565b600060208284031215613c6457600080fd5b61371a82613a92565b60008083601f840112613c7f57600080fd5b5081356001600160401b03811115613c9657600080fd5b602083019150836020828501011115613b7d57600080fd5b60008060208385031215613cc157600080fd5b82356001600160401b03811115613cd757600080fd5b613ce385828601613c6d565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d2357634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e648284613d05565b600060208284031215613d4757600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613d8f6060840182613d05565b5092915050565b80151581146131be57600080fd5b600060208284031215613db657600080fd5b813561371a81613d96565b600080600080600060608688031215613dd957600080fd5b85356001600160401b0380821115613df057600080fd5b613dfc89838a01613c6d565b90975095506020880135915080821115613e1557600080fd5b50613e2288828901613c6d565b96999598509660400135949350505050565b6001600160a01b03811681146131be57600080fd5b8035613aa981613e34565b60008060408385031215613e6757600080fd5b8235613e7281613e34565b946020939093013593505050565b600060208284031215613e9257600080fd5b813561371a81613e34565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613edb57613edb613e9d565b604052919050565b60006001600160401b03821115613efc57613efc613e9d565b5060051b60200190565b600082601f830112613f1757600080fd5b81356020613f2c613f2783613ee3565b613eb3565b82815260059290921b84018101918181019086841115613f4b57600080fd5b8286015b84811015613f665780358352918301918301613f4f565b509695505050505050565b600080600060608486031215613f8657600080fd5b83356001600160401b0380821115613f9d57600080fd5b818601915086601f830112613fb157600080fd5b81356020613fc1613f2783613ee3565b82815260059290921b8401810191818101908a841115613fe057600080fd5b948201945b83861015614007578535613ff881613e34565b82529482019490820190613fe5565b9750508701359250508082111561401d57600080fd5b5061402a86828701613f06565b92505061403960408501613e49565b90509250925092565b60008060006040848603121561405757600080fd5b83356001600160401b038082111561406e57600080fd5b61407a87838801613aae565b9450602086013591508082111561409057600080fd5b5061409d86828701613b39565b9497909650939450505050565b6000602082840312156140bc57600080fd5b815161371a81613d96565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261413b57600080fd5b8301803591506001600160401b0382111561415557600080fd5b6020019150600581901b3603821315613b7d57600080fd5b6000808335601e1984360301811261418457600080fd5b8301803591506001600160401b0382111561419e57600080fd5b602001915036819003821315613b7d57600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561422357600080fd5b813564ffffffffff8116811461371a57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561426157614261614238565b500190565b600060001982141561427a5761427a614238565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156143165781810151838201526020016142fe565b83811115614325576000848401525b50505050565b600081518084526143438160208601602086016142fb565b601f01601f19169290920160200192915050565b60808152600061436b60808301888a6142d2565b828103602084015261437d818861432b565b905082810360408401526143928186886142d2565b915050826060830152979650505050505050565b602081526000611f296020830184866142d2565b634e487b7160e01b600052601260045260246000fd5b6000826143df576143df6143ba565b500690565b6000826143f3576143f36143ba565b500490565b60006001600160401b038381169083168181101561441857614418614238565b039392505050565b60008235605e1983360301811261443657600080fd5b9190910192915050565b600062ffffff82168061445557614455614238565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561448957614489614238565b8260016001607f1b03190382128116156144a5576144a5614238565b50019392505050565b60006001600160401b038083168185168083038211156144d0576144d0614238565b01949350505050565b60008160001904831182151516156144f3576144f3614238565b500290565b60008282101561450a5761450a614238565b500390565b600082516144368184602087016142fb565b60006020828403121561453357600080fd5b5051919050565b80516020808301519190811015613ac05760001960209190910360031b1b16919050565b600083516145708184602088016142fb565b6001600160801b0319939093169190920190815260100192915050565b60008161459c5761459c614238565b506000190190565b600081600f0b60016001607f1b03198114156145c2576145c2614238565b60000392915050565b60006001600160ff1b03818413828413808216868404861116156145f1576145f1614238565b600160ff1b600087128281168783058912161561461057614610614238565b6000871292508782058712848416161561462c5761462c614238565b8785058712818416161561464257614642614238565b505050929093029392505050565b600064ffffffffff80841680614668576146686143ba565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561469f5761469f614238565b8160016001607f1b030183138116156146ba576146ba614238565b5090039392505050565b600064ffffffffff808416806146dc576146dc6143ba565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561470c5761470c614238565b02949350505050565b60208152600061371a602083018461432b56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220002ca3940b15bce6a4d5f27b0a1987d5e54e377a1f8883d1182d7970657188fd64736f6c634300080c0033", } // 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 5e42c775e..581fdd9d8 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\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a26469706673582212201d91474873f1f9666da47e29ea684bc3e5c714a0dd4f15579b6dac2513a51abb64736f6c634300080c0033", + Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220ea833cf27604c7df5ff5bf6157fb8b26ba635646b57c32d7a29c231f8151507b64736f6c634300080c0033", } // 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 251959f4a..aefe4e601 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220a4c040d9e2da8b5d43a459a5d81b42282f7f5d7494dd006947234324ced0db1264736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212207b48eb1db81d3714af9f8212d880bfc9c978d91666ce824895935637391fc42664736f6c634300080c0033", } // EigenStrategyABI 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 2936f8549..5d6ee0bf0 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212201eb90134850afcdd79513fc55e294305ddb99fd305384bb83205e19b2f0186cc64736f6c634300080c0033", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212200602ebe9d3368cfa5a06d45f76ac318319b189d6d4d072a05b19a32790e3257764736f6c634300080c0033", } // RewardsCoordinatorABI 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 cd44b46af..94dcf009e 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212202c0d3a696a4bc78c96a2f786064e2548f833ad9688ec6ef91ab7322860e488bd64736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122037c61feb73331dde2cef2090aa6cfafa473b8ed63df2bad4f00b472458477ae764736f6c634300080c0033", } // 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 da72458ad..492789ada 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122012dfe692c1c4584ca56ce25007c31abc59a573b1667f2849cd03594099b5939764736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220962ff7eef57b5c1bfe43a15b53cf7f7c88cdae4a4583a8b11b19665abd083a2264736f6c634300080c0033", } // StrategyBaseTVLLimitsABI 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 5c66607c3..5fce56dd6 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220130e44df653424e49b40ce0f697874f7c1190f6ee8bd0976aa4ad3f5d2047aad64736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220712e469c606f8283e2342dc341dc69f9dfb160cd6d17e154bae4836370b00dc864736f6c634300080c0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 003c2aecd..1a317d058 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -142,7 +142,7 @@ interface IEigenPod { * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. * @param stateRootProof proves a beacon state root against a beacon block root - * @param validatorIndices a list of validator indices being proven stale + * @param validatorIndices a list of validator indices being proven * @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root * @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for * details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator @@ -157,10 +157,23 @@ interface IEigenPod { external; /** - * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely - * checkpoint proofs since being slashed. If successful, this allows the caller to start a checkpoint. + * @dev Prove that one of this pod's active validators was slashed on the beacon chain. A successful + * staleness proof allows the caller to start a checkpoint. + * * @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed! * (See `_startCheckpoint` for details) + * + * @dev Note that this method allows anyone to start a checkpoint as soon as a slashing occurs on the beacon + * chain. This is intended to make it easier to external watchers to keep a pod's balance up to date. + * + * @dev Note too that beacon chain slashings are not instant. There is a delay between the initial slashing event + * and the validator's final exit back to the execution layer. During this time, the validator's balance may or + * may not drop further due to a correlation penalty. This method allows proof of a slashed validator + * to initiate a checkpoint for as long as the validator remains on the beacon chain. Once the validator + * has exited and been checkpointed at 0 balance, they are no longer "checkpoint-able" and cannot be proven + * "stale" via this method. + * See https://eth2book.info/capella/part3/transition/epoch/#slashings for more info. + * * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. * @param stateRootProof proves a beacon state root against a beacon block root @@ -169,7 +182,7 @@ interface IEigenPod { * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator * * @dev Staleness conditions: - * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` + * - Validator's last checkpoint is older than `beaconTimestamp` * - Validator MUST be in `ACTIVE` status in the pod * - Validator MUST be slashed on the beacon chain */ @@ -225,7 +238,7 @@ interface IEigenPod { /// @notice For each checkpoint, the total balance attributed to exited validators, in gwei /// - /// Note that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's + /// NOTE that the values added to this mapping are NOT guaranteed to capture the entirety of a validator's /// exit - rather, they capture the total change in a validator's balance when a checkpoint shows their /// balance change from nonzero to zero. While a change from nonzero to zero DOES guarantee that a validator /// has been fully exited, it is possible that the magnitude of this change does not capture what is @@ -245,5 +258,11 @@ interface IEigenPod { /// If this edge case impacts your usecase, it should be possible to mitigate this by monitoring for deposits /// to your exited validators, and waiting to call `startCheckpoint` until those deposits have been automatically /// exited. + /// + /// Additional edge cases this mapping does not cover: + /// - If a validator is slashed, their balance exited will reflect their original balance rather than the slashed amount + /// - The final partial withdrawal for an exited validator will be likely be included in this mapping. + /// i.e. if a validator was last checkpointed at 32.1 ETH before exiting, the next checkpoint will calculate their + /// "exited" amount to be 32.1 ETH rather than 32 ETH. function checkpointBalanceExitedGwei(uint64) external view returns (uint64); } diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index f878dc296..490ebdf5a 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -45,11 +45,6 @@ contract EigenPod is /// @notice The beacon chain stores balances in Gwei, rather than wei. This value is used to convert between the two uint256 internal constant GWEI_TO_WEI = 1e9; - /// @notice If a validator is slashed on the beacon chain and their balance has not been checkpointed - /// within `TIME_TILL_STALE_BALANCE` of the current block, `verifyStaleBalance` allows anyone to start - /// a checkpoint for the pod. - uint256 internal constant TIME_TILL_STALE_BALANCE = 2 weeks; - /// @notice The address of the EIP-4788 beacon block root oracle /// (See https://eips.ethereum.org/EIPS/eip-4788) address internal constant BEACON_ROOTS_ADDRESS = 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02; @@ -243,7 +238,7 @@ contract EigenPod is * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. * @param stateRootProof proves a beacon state root against a beacon block root - * @param validatorIndices a list of validator indices being proven stale + * @param validatorIndices a list of validator indices being proven * @param validatorFieldsProofs proofs of each validator's `validatorFields` against the beacon state root * @param validatorFields the fields of the beacon chain "Validator" container. See consensus specs for * details: https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator @@ -293,10 +288,23 @@ contract EigenPod is } /** - * @dev Prove that one or more validators were slashed on the beacon chain and have not had timely - * checkpoint proofs since being slashed. If successful, this allows the caller to start a checkpoint. + * @dev Prove that one of this pod's active validators was slashed on the beacon chain. A successful + * staleness proof allows the caller to start a checkpoint. + * * @dev Note that in order to start a checkpoint, any existing checkpoint must already be completed! * (See `_startCheckpoint` for details) + * + * @dev Note that this method allows anyone to start a checkpoint as soon as a slashing occurs on the beacon + * chain. This is intended to make it easier to external watchers to keep a pod's balance up to date. + * + * @dev Note too that beacon chain slashings are not instant. There is a delay between the initial slashing event + * and the validator's final exit back to the execution layer. During this time, the validator's balance may or + * may not drop further due to a correlation penalty. This method allows proof of a slashed validator + * to initiate a checkpoint for as long as the validator remains on the beacon chain. Once the validator + * has exited and been checkpointed at 0 balance, they are no longer "checkpoint-able" and cannot be proven + * "stale" via this method. + * See https://eth2book.info/capella/part3/transition/epoch/#slashings for more info. + * * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. * @param stateRootProof proves a beacon state root against a beacon block root @@ -305,7 +313,7 @@ contract EigenPod is * https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#validator * * @dev Staleness conditions: - * - Validator's last balance update is older than `beaconTimestamp` by `TIME_TILL_STALE_BALANCE` + * - Validator's last checkpoint is older than `beaconTimestamp` * - Validator MUST be in `ACTIVE` status in the pod * - Validator MUST be slashed on the beacon chain */ @@ -321,10 +329,26 @@ contract EigenPod is bytes32 validatorPubkey = proof.validatorFields.getPubkeyHash(); ValidatorInfo memory validatorInfo = _validatorPubkeyHashToInfo[validatorPubkey]; - // Validator must be eligible for a staleness proof + // Validator must be eligible for a staleness proof. Generally, this condition + // ensures that the staleness proof is newer than the last time we got an update + // on this validator. + // + // Note: It is possible for `validatorInfo.lastCheckpointedAt` to be 0 if + // a validator's withdrawal credentials are verified when no checkpoint has + // ever been completed in this pod. Technically, this would mean that `beaconTimestamp` + // can be any valid EIP-4788 timestamp - because any nonzero value satisfies the + // require below. + // + // However, in practice, if the only update we've seen from a validator is their + // `verifyWithdrawalCredentials` proof, any valid `verifyStaleBalance` proof is + // necessarily newer. This is because when a validator is initially slashed, their + // exit epoch is set. And because `verifyWithdrawalCredentials` rejects validators + // that have initiated exits, we know that if we're seeing a proof where the validator + // is slashed that it MUST be newer than the `verifyWithdrawalCredentials` proof + // (regardless of the relationship between `beaconTimestamp` and `lastCheckpointedAt`). require( - beaconTimestamp > validatorInfo.lastCheckpointedAt + TIME_TILL_STALE_BALANCE, - "EigenPod.verifyStaleBalance: validator balance is not stale yet" + beaconTimestamp > validatorInfo.lastCheckpointedAt, + "EigenPod.verifyStaleBalance: proof is older than last checkpoint" ); // Validator must be checkpoint-able @@ -398,7 +422,7 @@ contract EigenPod is withdrawableRestakedExecutionLayerGwei -= amountGwei; emit RestakedBeaconChainETHWithdrawn(recipient, amountWei); // transfer ETH from pod to `recipient` directly - _sendETH(recipient, amountWei); + Address.sendValue(payable(recipient), amountWei); } /******************************************************************************* @@ -606,10 +630,6 @@ contract EigenPod is } } - function _sendETH(address recipient, uint256 amountWei) internal { - Address.sendValue(payable(recipient), amountWei); - } - /// @notice Query the 4788 oracle to get the parent block root of the slot with the given `timestamp` /// @param timestamp of the block for which the parent block root will be returned. MUST correspond /// to an existing slot within the last 24 hours. If the slot at `timestamp` was skipped, this method diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 255facbc3..aaa16fd31 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -317,28 +317,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, return int128(uint128(newAmountGwei)) - int128(uint128(previousAmountGwei)); } - - /******************************************************************************* - verifyStaleBalance - *******************************************************************************/ - - /// @notice randomly roll forward to a stale timestamp. This assumes the beaconTimestamp being - /// passed into verifyStaleBalance is block.timestamp - function rollToStaleTimestamp( - EigenPodUser staker, - bytes32[] memory validatorFields, - uint64 rollSeconds - ) internal { - EigenPod pod = staker.pod(); - - IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(validatorFields.getPubkeyHash()); - uint64 rollForwardTimestamp = uint64(bound( - rollSeconds, - info.lastCheckpointedAt + TIME_TILL_STALE_BALANCE + 1, - info.lastCheckpointedAt + TIME_TILL_STALE_BALANCE + 1 + 2 weeks - )); - cheats.warp(rollForwardTimestamp); - } } contract EigenPodUnitTests_Initialization is EigenPodUnitTests { @@ -1458,18 +1436,43 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { beaconChain.advanceEpoch(); staker.verifyWithdrawalCredentials(validators); + staker.startCheckpoint(); + staker.completeCheckpoint(); + + uint64 lastCheckpointTimestamp = pod.lastCheckpointTimestamp(); // proof for given beaconTimestamp is not yet stale, this should revert StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - cheats.expectRevert("EigenPod.verifyStaleBalance: validator balance is not stale yet"); + cheats.expectRevert("EigenPod.verifyStaleBalance: proof is older than last checkpoint"); pod.verifyStaleBalance({ - beaconTimestamp: proofs.beaconTimestamp, + beaconTimestamp: lastCheckpointTimestamp, + stateRootProof: proofs.stateRootProof, + proof: proofs.validatorProof + }); + } + + /// @notice checks staleness condition when a pod has never completed a checkpoint before + /// The only value that will result in a revert here is `beaconTimestamp == 0` + function testFuzz_revert_validatorBalanceNotStale_NeverCheckpointed(uint256 rand) public { + // setup eigenpod staker and validators + (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + EigenPod pod = staker.pod(); + (uint40[] memory validators,) = staker.startValidators(); + uint40 validator = validators[0]; + beaconChain.advanceEpoch(); + staker.verifyWithdrawalCredentials(validators); + + // proof for given beaconTimestamp is not yet stale, this should revert + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); + cheats.expectRevert("EigenPod.verifyStaleBalance: proof is older than last checkpoint"); + pod.verifyStaleBalance({ + beaconTimestamp: 0, stateRootProof: proofs.stateRootProof, proof: proofs.validatorProof }); } /// @notice verifyStaleBalance should revert if validator status is not ACTIVE - function testFuzz_revert_validatorStatusNotActive(uint256 rand, uint64 randRollSeconds) public { + function testFuzz_revert_validatorStatusNotActive(uint256 rand) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); EigenPod pod = staker.pod(); @@ -1480,9 +1483,6 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { // validator should be INACTIVE and cause a revert beaconChain.advanceEpoch(); StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); - beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); cheats.expectRevert("EigenPod.verifyStaleBalance: validator is not active"); pod.verifyStaleBalance({ @@ -1493,7 +1493,7 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { } /// @notice verifyStaleBalance should revert if validator is not slashed - function testFuzz_revert_validatorNotSlashed(uint256 rand, uint64 randRollSeconds) public { + function testFuzz_revert_validatorNotSlashed(uint256 rand) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); EigenPod pod = staker.pod(); @@ -1505,9 +1505,6 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { // this should cause a revert beaconChain.advanceEpoch(); StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); - beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); cheats.expectRevert("EigenPod.verifyStaleBalance: validator must be slashed to be marked stale"); pod.verifyStaleBalance({ @@ -1518,7 +1515,7 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { } /// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof length - function testFuzz_revert_beaconStateRootProofInvalidLength(uint256 rand, uint64 randRollSeconds) public { + function testFuzz_revert_beaconStateRootProofInvalidLength(uint256 rand) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); EigenPod pod = staker.pod(); @@ -1526,13 +1523,10 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { uint40 validator = validators[0]; staker.verifyWithdrawalCredentials(validators); - // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward - beaconChain.advanceEpoch(); - StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + // Slash validators and advance epoch beaconChain.slashValidators(validators); beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); // change the proof to have an invalid length bytes memory proofWithInvalidLength = new bytes(proofs.stateRootProof.proof.length + 1); @@ -1550,7 +1544,7 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { } /// @notice verifyStaleBalance should revert with invalid beaconStateRoot proof - function testFuzz_revert_beaconStateRootProofInvalid(uint256 rand, uint64 randRollSeconds) public { + function testFuzz_revert_beaconStateRootProofInvalid(uint256 rand) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); EigenPod pod = staker.pod(); @@ -1558,13 +1552,10 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { uint40 validator = validators[0]; staker.verifyWithdrawalCredentials(validators); - // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward - beaconChain.advanceEpoch(); - StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + // Slash validators and advance epoch beaconChain.slashValidators(validators); beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); // change the proof to have an invalid value bytes1 randValue = bytes1(keccak256(abi.encodePacked(proofs.stateRootProof.proof[0]))); @@ -1582,8 +1573,7 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { /// @notice verifyStaleBalance should revert with invalid validatorFields and validator proof length function testFuzz_revert_validatorContainerProofInvalidLength( - uint256 rand, - uint64 randRollSeconds + uint256 rand ) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); @@ -1592,13 +1582,10 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { uint40 validator = validators[0]; staker.verifyWithdrawalCredentials(validators); - // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward - beaconChain.advanceEpoch(); - StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + // Slash validators and advance epoch beaconChain.slashValidators(validators); beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); // change the proof to have an invalid length uint256 proofLength = proofs.validatorProof.proof.length; @@ -1632,7 +1619,6 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { /// @notice verifyStaleBalance should revert with invalid validatorContainer proof function testFuzz_revert_validatorContainerProofInvalid( uint256 rand, - uint64 randRollSeconds, bytes32 randWithdrawalCredentials ) public { // setup eigenpod staker and validators @@ -1642,13 +1628,10 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { uint40 validator = validators[0]; staker.verifyWithdrawalCredentials(validators); - // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward - beaconChain.advanceEpoch(); - StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + // Slash validators and advance epoch beaconChain.slashValidators(validators); beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); // change validator withdrawal creds to an invalid value causing a revert uint256 VALIDATOR_WITHDRAWAL_CREDENTIALS_INDEX = 1; @@ -1663,8 +1646,7 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { } function testFuzz_verifyStaleBalance( - uint256 rand, - uint64 randRollSeconds + uint256 rand ) public { // setup eigenpod staker and validators (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); @@ -1673,13 +1655,10 @@ contract EigenPodUnitTests_verifyStaleBalance is EigenPodUnitTests { uint40 validator = validators[0]; staker.verifyWithdrawalCredentials(validators); - // Advance epoch where validators got slashed. Use stale balance proof by rolling timestamp forward - beaconChain.advanceEpoch(); - StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); - rollToStaleTimestamp(staker, proofs.validatorProof.validatorFields, randRollSeconds); + // Slash validators and advance epoch beaconChain.slashValidators(validators); beaconChain.advanceEpoch(); - proofs = beaconChain.getStaleBalanceProofs(validator); + StaleBalanceProofs memory proofs = beaconChain.getStaleBalanceProofs(validator); cheats.expectEmit(true, true, true, true, address(staker.pod())); emit CheckpointCreated(uint64(block.timestamp), EIP_4788_ORACLE.timestampToBlockRoot(block.timestamp)); From cb9d77495086f62cdd5b24dd18f650c46d583799 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Fri, 21 Jun 2024 21:31:29 +0000 Subject: [PATCH 29/85] chore: fix bindings --- pkg/bindings/BackingEigen/binding.go | 2 +- pkg/bindings/BytesLib/binding.go | 2 +- pkg/bindings/EIP1271SignatureUtils/binding.go | 2 +- pkg/bindings/Eigen/binding.go | 2 +- pkg/bindings/Endian/binding.go | 2 +- pkg/bindings/Merkle/binding.go | 2 +- pkg/bindings/Pausable/binding.go | 2 +- pkg/bindings/PauserRegistry/binding.go | 2 +- pkg/bindings/StructuredLinkedList/binding.go | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkg/bindings/BackingEigen/binding.go b/pkg/bindings/BackingEigen/binding.go index 1efa2af77..2ed34f20f 100644 --- a/pkg/bindings/BackingEigen/binding.go +++ b/pkg/bindings/BackingEigen/binding.go @@ -38,7 +38,7 @@ type ERC20VotesUpgradeableCheckpoint struct { // BackingEigenMetaData contains all meta data concerning the BackingEigen contract. var BackingEigenMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedFrom\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20VotesUpgradeable.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableTransferRestrictions\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferRestrictionsDisabledAfter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Backed\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedFrom\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SetAllowedTo\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAllowedTo\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TransferRestrictionsDisabled\",\"inputs\":[],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620054f6380380620054f68339818101604052810190620000379190620001c6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200007b6200008260201b60201c565b50620002dc565b600060019054906101000a900460ff1615620000d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cc906200027f565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff1614620001465760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013d9190620002bf565b60405180910390a15b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200017a826200014d565b9050919050565b60006200018e826200016d565b9050919050565b620001a08162000181565b8114620001ac57600080fd5b50565b600081519050620001c08162000195565b92915050565b600060208284031215620001df57620001de62000148565b5b6000620001ef84828501620001af565b91505092915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b600062000267602783620001f8565b9150620002748262000209565b604082019050919050565b600060208201905081810360008301526200029a8162000258565b9050919050565b600060ff82169050919050565b620002b981620002a1565b82525050565b6000602082019050620002d66000830184620002ae565b92915050565b6080516151e262000314600039600081816111fc015281816112270152818161125201528181611273015261179101526151e26000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146106a5578063eb415f45146106d5578063f1127ed8146106df578063f2fde38b1461070f578063fdc371ce1461072b5761021c565b8063b8c2559414610635578063c3cda52014610651578063c4d66de81461066d578063d505accf146106895761021c565b806395d89b41116100f457806395d89b41146105695780639ab24eb0146105875780639aec4bae146105b7578063a457c2d7146105d5578063a9059cbb146106055761021c565b806384b0196e146104d95780638da5cb5b146104fd5780638e539e8c1461051b57806391ddadf41461054b5761021c565b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461040f57806370a082311461043f578063715018a61461046f57806378aa33ba146104795780637ecebe00146104a95761021c565b80633a46b1a8146103755780634bf5d7e9146103a5578063587cde1e146103c35780635c19a95c146103f35761021c565b80631ffacdef116101ef5780631ffacdef146102bd57806323b872dd146102d9578063313ce567146103095780633644e5151461032757806339509351146103455761021c565b80630455e6941461022157806306fdde0314610251578063095ea7b31461026f57806318160ddd1461029f575b600080fd5b61023b60048036038101906102369190613727565b610749565b604051610248919061376f565b60405180910390f35b61025961076a565b6040516102669190613823565b60405180910390f35b6102896004803603810190610284919061387b565b6107fc565b604051610296919061376f565b60405180910390f35b6102a761081f565b6040516102b491906138ca565b60405180910390f35b6102d760048036038101906102d29190613911565b610829565b005b6102f360048036038101906102ee9190613951565b61083f565b604051610300919061376f565b60405180910390f35b61031161086e565b60405161031e91906139c0565b60405180910390f35b61032f610877565b60405161033c91906139f4565b60405180910390f35b61035f600480360381019061035a919061387b565b610886565b60405161036c919061376f565b60405180910390f35b61038f600480360381019061038a919061387b565b6108bd565b60405161039c91906138ca565b60405180910390f35b6103ad610960565b6040516103ba9190613823565b60405180910390f35b6103dd60048036038101906103d89190613727565b61099d565b6040516103ea9190613a1e565b60405180910390f35b61040d60048036038101906104089190613727565b610a06565b005b61042960048036038101906104249190613727565b610a1a565b6040516104369190613a58565b60405180910390f35b61045960048036038101906104549190613727565b610a6e565b60405161046691906138ca565b60405180910390f35b610477610ab7565b005b610493600480360381019061048e9190613727565b610acb565b6040516104a0919061376f565b60405180910390f35b6104c360048036038101906104be9190613727565b610aec565b6040516104d091906138ca565b60405180910390f35b6104e1610b3c565b6040516104f49796959493929190613b6c565b60405180910390f35b610505610c3d565b6040516105129190613a1e565b60405180910390f35b61053560048036038101906105309190613bf0565b610c67565b60405161054291906138ca565b60405180910390f35b610553610ccd565b6040516105609190613c3e565b60405180910390f35b610571610cdd565b60405161057e9190613823565b60405180910390f35b6105a1600480360381019061059c9190613727565b610d6f565b6040516105ae91906138ca565b60405180910390f35b6105bf610e77565b6040516105cc91906138ca565b60405180910390f35b6105ef60048036038101906105ea919061387b565b610e7e565b6040516105fc919061376f565b60405180910390f35b61061f600480360381019061061a919061387b565b610ef5565b60405161062c919061376f565b60405180910390f35b61064f600480360381019061064a9190613911565b610f18565b005b61066b60048036038101906106669190613cb1565b610f2e565b005b61068760048036038101906106829190613727565b611032565b005b6106a3600480360381019061069e9190613d3e565b61138e565b005b6106bf60048036038101906106ba9190613de0565b6114d0565b6040516106cc91906138ca565b60405180910390f35b6106dd611557565b005b6106f960048036038101906106f49190613e4c565b6115fb565b6040516107069190613f01565b60405180910390f35b61072960048036038101906107249190613727565b61170b565b005b61073361178f565b6040516107409190613f7b565b60405180910390f35b6101316020528060005260406000206000915054906101000a900460ff1681565b60606068805461077990613fc5565b80601f01602080910402602001604051908101604052809291908181526020018280546107a590613fc5565b80156107f25780601f106107c7576101008083540402835291602001916107f2565b820191906000526020600020905b8154815290600101906020018083116107d557829003601f168201915b5050505050905090565b6000806108076117b3565b90506108148185856117bb565b600191505092915050565b6000606754905090565b610831611986565b61083b8282611a04565b5050565b60008061084a6117b3565b9050610857858285611aae565b610862858585611b3a565b60019150509392505050565b60006012905090565b6000610881611db5565b905090565b6000806108916117b3565b90506108b28185856108a385896114d0565b6108ad9190614026565b6117bb565b600191505092915050565b60006108c7610ccd565b65ffffffffffff168210610910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610907906140c8565b60405180910390fd5b61095860ff60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611dc4565b905092915050565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a17610a116117b3565b82611f0c565b50565b6000610a6760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612026565b9050919050565b6000606560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610abf611986565b610ac96000612079565b565b6101326020528060005260406000206000915054906101000a900460ff1681565b6000610b3560cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061213f565b9050919050565b6000606080600080600060606000801b609754148015610b6057506000801b609854145b610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690614134565b60405180910390fd5b610ba761214d565b610baf6121df565b46306000801b600067ffffffffffffffff811115610bd057610bcf614154565b5b604051908082528060200260200182016040528015610bfe5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c71610ccd565b65ffffffffffff168210610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb1906140c8565b60405180910390fd5b610cc661010083611dc4565b9050919050565b6000610cd842612271565b905090565b606060698054610cec90613fc5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1890613fc5565b8015610d655780601f10610d3a57610100808354040283529160200191610d65565b820191906000526020600020905b815481529060010190602001808311610d4857829003601f168201915b5050505050905090565b60008060ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610e4e5760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001820381548110610e1357610e12614183565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610e51565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101305481565b600080610e896117b3565b90506000610e9782866114d0565b905083811015610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed390614224565b60405180910390fd5b610ee982868684036117bb565b60019250505092915050565b600080610f006117b3565b9050610f0d818585611b3a565b600191505092915050565b610f20611986565b610f2a82826122c6565b5050565b83421115610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890614290565b60405180910390fd5b6000610fd3610fcb7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610fb094939291906142b0565b60405160208183030381529060405280519060200120612370565b85858561238a565b9050610fde816123b5565b861461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614341565b60405180910390fd5b6110298188611f0c565b50505050505050565b60008060019054906101000a900460ff161590508080156110635750600160008054906101000a900460ff1660ff16105b80611090575061107230612413565b15801561108f5750600160008054906101000a900460ff1660ff16145b5b6110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c6906143d3565b60405180910390fd5b60016000806101000a81548160ff021916908360ff160217905550801561110c576001600060016101000a81548160ff0219169083151502179055505b611114612436565b6111886040518060400160405280600d81526020017f4261636b696e6720456967656e000000000000000000000000000000000000008152506040518060400160405280600681526020017f62454947454e000000000000000000000000000000000000000000000000000081525061248f565b61119182612079565b6111cf6040518060400160405280600681526020017f62454947454e00000000000000000000000000000000000000000000000000008152506124ec565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610130819055506112227f00000000000000000000000000000000000000000000000000000000000000006001611a04565b61124d7f000000000000000000000000000000000000000000000000000000000000000060016122c6565b6113057f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113009190614408565b61257d565b7fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2660405160405180910390a1801561138a5760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516113819190614470565b60405180910390a15b5050565b834211156113d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c8906144d7565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886114008c6123b5565b89604051602001611416969594939291906144f7565b604051602081830303815290604052805190602001209050600061143982612370565b905060006114498287878761238a565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906145a4565b60405180910390fd5b6114c48a8a8a6117bb565b50505050505050505050565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61155f611986565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61013054146115c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bb9061465c565b60405180910390fd5b6000610130819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b6116036135e3565b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff168154811061165a57611659614183565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611713611986565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a906146ee565b60405180910390fd5b61178c81612079565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561182b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182290614780565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189290614812565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161197991906138ca565b60405180910390a3505050565b61198e6117b3565b73ffffffffffffffffffffffffffffffffffffffff166119ac610c3d565b73ffffffffffffffffffffffffffffffffffffffff1614611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f99061487e565b60405180910390fd5b565b8061013160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051611aa2919061376f565b60405180910390a25050565b6000611aba84846114d0565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611b345781811015611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906148ea565b60405180910390fd5b611b3384848484036117bb565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba19061497c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1190614a0e565b60405180910390fd5b611c2583838361260b565b6000606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390614aa0565b60405180910390fd5b818103606560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611d9c91906138ca565b60405180910390a3611daf84848461273f565b50505050565b6000611dbf61276a565b905090565b600080838054905090506000808290506005831115611e3a576000611de8846127ce565b84611df39190614ac0565b905085611e0088836128c8565b60000160009054906101000a900463ffffffff1663ffffffff161115611e2857809150611e38565b600181611e359190614026565b92505b505b5b80821015611e9a576000611e4f83836128dd565b905085611e5c88836128c8565b60000160009054906101000a900463ffffffff1663ffffffff161115611e8457809150611e94565b600181611e919190614026565b92505b50611e3b565b60008114611ee057611eaf86600183036128c8565b60000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611ee3565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b6000611f178361099d565b90506000611f2484610a6e565b90508260fe60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4612020828483612903565b50505050565b600063ffffffff8016821115612071576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206890614b66565b60405180910390fd5b819050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b60606099805461215c90613fc5565b80601f016020809104026020016040519081016040528092919081815260200182805461218890613fc5565b80156121d55780601f106121aa576101008083540402835291602001916121d5565b820191906000526020600020905b8154815290600101906020018083116121b857829003601f168201915b5050505050905090565b6060609a80546121ee90613fc5565b80601f016020809104026020016040519081016040528092919081815260200182805461221a90613fc5565b80156122675780601f1061223c57610100808354040283529160200191612267565b820191906000526020600020905b81548152906001019060200180831161224a57829003601f168201915b5050505050905090565b600065ffffffffffff80168211156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614bf8565b60405180910390fd5b819050919050565b8061013260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b82604051612364919061376f565b60405180910390a25050565b600061238361237d611db5565b83612afc565b9050919050565b600080600061239b87878787612b3d565b915091506123a881612c20565b8192505050949350505050565b60008060cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506124028161213f565b915061240d81612d8e565b50919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247c90614c8a565b60405180910390fd5b61248d612da4565b565b600060019054906101000a900460ff166124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590614c8a565b60405180910390fd5b6124e88282612e05565b5050565b600060019054906101000a900460ff1661253b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253290614c8a565b60405180910390fd5b61257a816040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250612e86565b50565b6125878282612f1b565b61258f613073565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166125b561081f565b11156125f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ed90614d1c565b60405180910390fd5b612605610100613097836130ad565b50505050565b61013054421161272f5761013160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806126b8575061013260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806126ef5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b61272e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272590614dd4565b60405180910390fd5b5b61273a838383613388565b505050565b61274a83838361338d565b6127656127568461099d565b61275f8461099d565b83612903565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612795613392565b61279d6133fd565b46306040516020016127b3959493929190614df4565b60405160208183030381529060405280519060200120905090565b6000808214156127e157600090506128c3565b600060016127ee84613468565b901c6001901b9050600181848161280857612807614e47565b5b048201901c9050600181848161282157612820614e47565b5b048201901c9050600181848161283a57612839614e47565b5b048201901c9050600181848161285357612852614e47565b5b048201901c9050600181848161286c5761286b614e47565b5b048201901c9050600181848161288557612884614e47565b5b048201901c9050600181848161289e5761289d614e47565b5b048201901c90506128bf818285816128b9576128b8614e47565b5b04613549565b9150505b919050565b60008260005281602060002001905092915050565b600060028284186128ee9190614e76565b8284166128fb9190614026565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561293f5750600081115b15612af757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1d576000806129c660ff60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613562856130ad565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a12929190614ea7565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612af657600080612a9f60ff60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613097856130ad565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612aeb929190614ea7565b60405180910390a250505b5b505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b78576000600391509150612c17565b600060018787878760405160008152602001604052604051612b9d9493929190614ed0565b6020604051602081039080840390855afa158015612bbf573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c0e57600060019250925050612c17565b80600092509250505b94509492505050565b60006004811115612c3457612c33614f15565b5b816004811115612c4757612c46614f15565b5b1415612c5257612d8b565b60016004811115612c6657612c65614f15565b5b816004811115612c7957612c78614f15565b5b1415612cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb190614f90565b60405180910390fd5b60026004811115612cce57612ccd614f15565b5b816004811115612ce157612ce0614f15565b5b1415612d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1990614ffc565b60405180910390fd5b60036004811115612d3657612d35614f15565b5b816004811115612d4957612d48614f15565b5b1415612d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d819061508e565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b600060019054906101000a900460ff16612df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dea90614c8a565b60405180910390fd5b612e03612dfe6117b3565b612079565b565b600060019054906101000a900460ff16612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90614c8a565b60405180910390fd5b8160689080519060200190612e6a929190613621565b508060699080519060200190612e81929190613621565b505050565b600060019054906101000a900460ff16612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc90614c8a565b60405180910390fd5b8160999080519060200190612eeb929190613621565b5080609a9080519060200190612f02929190613621565b506000801b6097819055506000801b6098819055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f82906150fa565b60405180910390fd5b612f976000838361260b565b8060676000828254612fa99190614026565b9250508190555080606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161305b91906138ca565b60405180910390a361306f6000838361273f565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600081836130a59190614026565b905092915050565b6000806000858054905090506000808214613173576130cf87600184036128c8565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250506131af565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506131e484868863ffffffff16565b925060008211801561320e57506131f9610ccd565b65ffffffffffff16816000015163ffffffff16145b1561327f5761321c83613578565b61322988600185036128c8565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555061337e565b8660405180604001604052806132a3613296610ccd565b65ffffffffffff16612026565b63ffffffff1681526020016132b786613578565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b505050565b505050565b60008061339d61214d565b90506000815111156133b95780805190602001209150506133fa565b600060975490506000801b81146133d45780925050506133fa565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b6000806134086121df565b9050600081511115613424578080519060200120915050613465565b600060985490506000801b811461343f578092505050613465565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080600090506000608084901c111561348a57608083901c92506080810190505b6000604084901c11156134a557604083901c92506040810190505b6000602084901c11156134c057602083901c92506020810190505b6000601084901c11156134db57601083901c92506010810190505b6000600884901c11156134f657600883901c92506008810190505b6000600484901c111561351157600483901c92506004810190505b6000600284901c111561352c57600283901c92506002810190505b6000600184901c1115613540576001810190505b80915050919050565b6000818310613558578161355a565b825b905092915050565b600081836135709190614ac0565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff80168211156135db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d29061518c565b60405180910390fd5b819050919050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b82805461362d90613fc5565b90600052602060002090601f01602090048101928261364f5760008555613696565b82601f1061366857805160ff1916838001178555613696565b82800160010185558215613696579182015b8281111561369557825182559160200191906001019061367a565b5b5090506136a391906136a7565b5090565b5b808211156136c05760008160009055506001016136a8565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136f4826136c9565b9050919050565b613704816136e9565b811461370f57600080fd5b50565b600081359050613721816136fb565b92915050565b60006020828403121561373d5761373c6136c4565b5b600061374b84828501613712565b91505092915050565b60008115159050919050565b61376981613754565b82525050565b60006020820190506137846000830184613760565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137c45780820151818401526020810190506137a9565b838111156137d3576000848401525b50505050565b6000601f19601f8301169050919050565b60006137f58261378a565b6137ff8185613795565b935061380f8185602086016137a6565b613818816137d9565b840191505092915050565b6000602082019050818103600083015261383d81846137ea565b905092915050565b6000819050919050565b61385881613845565b811461386357600080fd5b50565b6000813590506138758161384f565b92915050565b60008060408385031215613892576138916136c4565b5b60006138a085828601613712565b92505060206138b185828601613866565b9150509250929050565b6138c481613845565b82525050565b60006020820190506138df60008301846138bb565b92915050565b6138ee81613754565b81146138f957600080fd5b50565b60008135905061390b816138e5565b92915050565b60008060408385031215613928576139276136c4565b5b600061393685828601613712565b9250506020613947858286016138fc565b9150509250929050565b60008060006060848603121561396a576139696136c4565b5b600061397886828701613712565b935050602061398986828701613712565b925050604061399a86828701613866565b9150509250925092565b600060ff82169050919050565b6139ba816139a4565b82525050565b60006020820190506139d560008301846139b1565b92915050565b6000819050919050565b6139ee816139db565b82525050565b6000602082019050613a0960008301846139e5565b92915050565b613a18816136e9565b82525050565b6000602082019050613a336000830184613a0f565b92915050565b600063ffffffff82169050919050565b613a5281613a39565b82525050565b6000602082019050613a6d6000830184613a49565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b613aa881613a73565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ae381613845565b82525050565b6000613af58383613ada565b60208301905092915050565b6000602082019050919050565b6000613b1982613aae565b613b238185613ab9565b9350613b2e83613aca565b8060005b83811015613b5f578151613b468882613ae9565b9750613b5183613b01565b925050600181019050613b32565b5085935050505092915050565b600060e082019050613b81600083018a613a9f565b8181036020830152613b9381896137ea565b90508181036040830152613ba781886137ea565b9050613bb660608301876138bb565b613bc36080830186613a0f565b613bd060a08301856139e5565b81810360c0830152613be28184613b0e565b905098975050505050505050565b600060208284031215613c0657613c056136c4565b5b6000613c1484828501613866565b91505092915050565b600065ffffffffffff82169050919050565b613c3881613c1d565b82525050565b6000602082019050613c536000830184613c2f565b92915050565b613c62816139a4565b8114613c6d57600080fd5b50565b600081359050613c7f81613c59565b92915050565b613c8e816139db565b8114613c9957600080fd5b50565b600081359050613cab81613c85565b92915050565b60008060008060008060c08789031215613cce57613ccd6136c4565b5b6000613cdc89828a01613712565b9650506020613ced89828a01613866565b9550506040613cfe89828a01613866565b9450506060613d0f89828a01613c70565b9350506080613d2089828a01613c9c565b92505060a0613d3189828a01613c9c565b9150509295509295509295565b600080600080600080600060e0888a031215613d5d57613d5c6136c4565b5b6000613d6b8a828b01613712565b9750506020613d7c8a828b01613712565b9650506040613d8d8a828b01613866565b9550506060613d9e8a828b01613866565b9450506080613daf8a828b01613c70565b93505060a0613dc08a828b01613c9c565b92505060c0613dd18a828b01613c9c565b91505092959891949750929550565b60008060408385031215613df757613df66136c4565b5b6000613e0585828601613712565b9250506020613e1685828601613712565b9150509250929050565b613e2981613a39565b8114613e3457600080fd5b50565b600081359050613e4681613e20565b92915050565b60008060408385031215613e6357613e626136c4565b5b6000613e7185828601613712565b9250506020613e8285828601613e37565b9150509250929050565b613e9581613a39565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b613ecc81613e9b565b82525050565b604082016000820151613ee86000850182613e8c565b506020820151613efb6020850182613ec3565b50505050565b6000604082019050613f166000830184613ed2565b92915050565b6000819050919050565b6000613f41613f3c613f37846136c9565b613f1c565b6136c9565b9050919050565b6000613f5382613f26565b9050919050565b6000613f6582613f48565b9050919050565b613f7581613f5a565b82525050565b6000602082019050613f906000830184613f6c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613fdd57607f821691505b60208210811415613ff157613ff0613f96565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061403182613845565b915061403c83613845565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407157614070613ff7565b5b828201905092915050565b7f4552433230566f7465733a20667574757265206c6f6f6b757000000000000000600082015250565b60006140b2601983613795565b91506140bd8261407c565b602082019050919050565b600060208201905081810360008301526140e1816140a5565b9050919050565b7f4549503731323a20556e696e697469616c697a65640000000000000000000000600082015250565b600061411e601583613795565b9150614129826140e8565b602082019050919050565b6000602082019050818103600083015261414d81614111565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b600061420e602583613795565b9150614219826141b2565b604082019050919050565b6000602082019050818103600083015261423d81614201565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b600061427a601d83613795565b915061428582614244565b602082019050919050565b600060208201905081810360008301526142a98161426d565b9050919050565b60006080820190506142c560008301876139e5565b6142d26020830186613a0f565b6142df60408301856138bb565b6142ec60608301846138bb565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b600061432b601983613795565b9150614336826142f5565b602082019050919050565b6000602082019050818103600083015261435a8161431e565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006143bd602e83613795565b91506143c882614361565b604082019050919050565b600060208201905081810360008301526143ec816143b0565b9050919050565b6000815190506144028161384f565b92915050565b60006020828403121561441e5761441d6136c4565b5b600061442c848285016143f3565b91505092915050565b6000819050919050565b600061445a61445561445084614435565b613f1c565b6139a4565b9050919050565b61446a8161443f565b82525050565b60006020820190506144856000830184614461565b92915050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b60006144c1601d83613795565b91506144cc8261448b565b602082019050919050565b600060208201905081810360008301526144f0816144b4565b9050919050565b600060c08201905061450c60008301896139e5565b6145196020830188613a0f565b6145266040830187613a0f565b61453360608301866138bb565b61454060808301856138bb565b61454d60a08301846138bb565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b600061458e601e83613795565b915061459982614558565b602082019050919050565b600060208201905081810360008301526145bd81614581565b9050919050565b7f4261636b696e67456967656e2e64697361626c655472616e736665725265737460008201527f72696374696f6e733a207472616e73666572207265737472696374696f6e732060208201527f61726520616c72656164792064697361626c6564000000000000000000000000604082015250565b6000614646605483613795565b9150614651826145c4565b606082019050919050565b6000602082019050818103600083015261467581614639565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146d8602683613795565b91506146e38261467c565b604082019050919050565b60006020820190508181036000830152614707816146cb565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061476a602483613795565b91506147758261470e565b604082019050919050565b600060208201905081810360008301526147998161475d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006147fc602283613795565b9150614807826147a0565b604082019050919050565b6000602082019050818103600083015261482b816147ef565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614868602083613795565b915061487382614832565b602082019050919050565b600060208201905081810360008301526148978161485b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006148d4601d83613795565b91506148df8261489e565b602082019050919050565b60006020820190508181036000830152614903816148c7565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614966602583613795565b91506149718261490a565b604082019050919050565b6000602082019050818103600083015261499581614959565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006149f8602383613795565b9150614a038261499c565b604082019050919050565b60006020820190508181036000830152614a27816149eb565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000614a8a602683613795565b9150614a9582614a2e565b604082019050919050565b60006020820190508181036000830152614ab981614a7d565b9050919050565b6000614acb82613845565b9150614ad683613845565b925082821015614ae957614ae8613ff7565b5b828203905092915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000614b50602683613795565b9150614b5b82614af4565b604082019050919050565b60006020820190508181036000830152614b7f81614b43565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203460008201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b6000614be2602683613795565b9150614bed82614b86565b604082019050919050565b60006020820190508181036000830152614c1181614bd5565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000614c74602b83613795565b9150614c7f82614c18565b604082019050919050565b60006020820190508181036000830152614ca381614c67565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000614d06603083613795565b9150614d1182614caa565b604082019050919050565b60006020820190508181036000830152614d3581614cf9565b9050919050565b7f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560008201527f723a2066726f6d206f7220746f206d7573742062652077686974656c6973746560208201527f6400000000000000000000000000000000000000000000000000000000000000604082015250565b6000614dbe604183613795565b9150614dc982614d3c565b606082019050919050565b60006020820190508181036000830152614ded81614db1565b9050919050565b600060a082019050614e0960008301886139e5565b614e1660208301876139e5565b614e2360408301866139e5565b614e3060608301856138bb565b614e3d6080830184613a0f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e8182613845565b9150614e8c83613845565b925082614e9c57614e9b614e47565b5b828204905092915050565b6000604082019050614ebc60008301856138bb565b614ec960208301846138bb565b9392505050565b6000608082019050614ee560008301876139e5565b614ef260208301866139b1565b614eff60408301856139e5565b614f0c60608301846139e5565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614f7a601883613795565b9150614f8582614f44565b602082019050919050565b60006020820190508181036000830152614fa981614f6d565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614fe6601f83613795565b9150614ff182614fb0565b602082019050919050565b6000602082019050818103600083015261501581614fd9565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000615078602283613795565b91506150838261501c565b604082019050919050565b600060208201905081810360008301526150a78161506b565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006150e4601f83613795565b91506150ef826150ae565b602082019050919050565b60006020820190508181036000830152615113816150d7565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000615176602783613795565b91506151818261511a565b604082019050919050565b600060208201905081810360008301526151a581615169565b905091905056fea264697066735822122060db62da3a4a379851eab5944d0f153a00cbb25ad451a09efe4dd831c021f4e864736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002b4438038062002b44833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516129c76200017d6000396000818161056f01528181610c5b01528181610c8601528181610cb10152610cd201526129c76000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806384b0196e11610125578063b8c25594116100ad578063dd62ed3e1161007c578063dd62ed3e146104ff578063eb415f4514610512578063f1127ed81461051a578063f2fde38b14610557578063fdc371ce1461056a57600080fd5b8063b8c25594146104b3578063c3cda520146104c6578063c4d66de8146104d9578063d505accf146104ec57600080fd5b806395d89b41116100f457806395d89b41146104685780639ab24eb0146104705780639aec4bae14610483578063a457c2d71461048d578063a9059cbb146104a057600080fd5b806384b0196e1461040a5780638da5cb5b146104255780638e539e8c1461043657806391ddadf41461044957600080fd5b80633a46b1a8116101a85780636fcfff45116101775780636fcfff451461037a57806370a08231146103a2578063715018a6146103cb57806378aa33ba146103d35780637ecebe00146103f757600080fd5b80633a46b1a8146102e65780634bf5d7e9146102f9578063587cde1e146103235780635c19a95c1461036757600080fd5b80631ffacdef116101ef5780631ffacdef1461029457806323b872dd146102a9578063313ce567146102bc5780633644e515146102cb57806339509351146102d357600080fd5b80630455e6941461022157806306fdde031461025a578063095ea7b31461026f57806318160ddd14610282575b600080fd5b61024561022f366004612548565b6101316020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610262610591565b60405161025191906125b0565b61024561027d3660046125c3565b610623565b6067545b604051908152602001610251565b6102a76102a23660046125ed565b61063b565b005b6102456102b7366004612629565b610651565b60405160128152602001610251565b610286610675565b6102456102e13660046125c3565b610684565b6102866102f43660046125c3565b6106a6565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b6020820152610262565b61034f610331366004612548565b6001600160a01b03908116600090815260fe60205260409020541690565b6040516001600160a01b039091168152602001610251565b6102a7610375366004612548565b610730565b61038d610388366004612548565b61073d565b60405163ffffffff9091168152602001610251565b6102866103b0366004612548565b6001600160a01b031660009081526065602052604090205490565b6102a7610765565b6102456103e1366004612548565b6101326020526000908152604090205460ff1681565b610286610405366004612548565b610779565b610412610797565b6040516102519796959493929190612665565b6033546001600160a01b031661034f565b6102866104443660046126fb565b610835565b61045161089d565b60405165ffffffffffff9091168152602001610251565b6102626108a8565b61028661047e366004612548565b6108b7565b6102866101305481565b61024561049b3660046125c3565b610939565b6102456104ae3660046125c3565b6109b4565b6102a76104c13660046125ed565b6109c2565b6102a76104d4366004612725565b6109d4565b6102a76104e7366004612548565b610b0a565b6102a76104fa36600461277d565b610dc9565b61028661050d3660046127e7565b610f2d565b6102a7610f58565b61052d61052836600461281a565b611028565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610251565b6102a7610565366004612548565b6110ac565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b6060606880546105a09061284f565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061284f565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600033610631818585611122565b5060019392505050565b610643611246565b61064d82826112a0565b5050565b60003361065f858285611301565b61066a85858561137b565b506001949350505050565b600061067f611537565b905090565b6000336106318185856106978383610f2d565b6106a1919061289a565b611122565b60006106b061089d565b65ffffffffffff1682106107075760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064015b60405180910390fd5b6001600160a01b038316600090815260ff602052604090206107299083611541565b9392505050565b61073a338261162a565b50565b6001600160a01b038116600090815260ff602052604081205461075f906116a4565b92915050565b61076d611246565b610777600061170d565b565b6001600160a01b038116600090815260cb602052604081205461075f565b6000606080600080600060606097546000801b1480156107b75750609854155b6107fb5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b60448201526064016106fe565b61080361175f565b61080b61176e565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b600061083f61089d565b65ffffffffffff1682106108915760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b60448201526064016106fe565b61075f61010083611541565b600061067f4261177d565b6060606980546105a09061284f565b6001600160a01b038116600090815260ff60205260408120548015610926576001600160a01b038316600090815260ff6020526040902080546000198301908110610904576109046128b2565b60009182526020909120015464010000000090046001600160e01b0316610929565b60005b6001600160e01b03169392505050565b600033816109478286610f2d565b9050838110156109a75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106fe565b61066a8286868403611122565b60003361063181858561137b565b6109ca611246565b61064d82826117e4565b83421115610a245760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016106fe565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610a9e90610a969060a0016040516020818303038152906040528051906020012061183d565b85858561186a565b9050610aa981611892565b8614610af75760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016106fe565b610b01818861162a565b50505050505050565b600054610100900460ff1615808015610b2a5750600054600160ff909116105b80610b445750303b158015610b44575060005460ff166001145b610ba75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106fe565b6000805460ff191660011790558015610bca576000805461ff0019166101001790555b610bd26118ba565b610c1f6040518060400160405280600d81526020016c2130b1b5b4b7339022b4b3b2b760991b815250604051806040016040528060068152602001653122a4a3a2a760d11b8152506118e9565b610c288261170d565b610c4f604051806040016040528060068152602001653122a4a3a2a760d11b81525061191a565b60001961013055610c817f000000000000000000000000000000000000000000000000000000000000000060016112a0565b610cac7f000000000000000000000000000000000000000000000000000000000000000060016117e4565b610d577f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5291906128c8565b611964565b6040517fb7c23c1e2e36f298e9879a88ecfcd07e28fbb439bcfa9c78ca1363ca14370d2690600090a1801561064d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b83421115610e195760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016106fe565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e488c611892565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610ea38261183d565b90506000610eb38287878761186a565b9050896001600160a01b0316816001600160a01b031614610f165760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016106fe565b610f218a8a8a611122565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b610f60611246565b6000196101305414610ff75760405162461bcd60e51b815260206004820152605460248201527f4261636b696e67456967656e2e64697361626c655472616e736665725265737460448201527f72696374696f6e733a207472616e73666572207265737472696374696f6e7320606482015273185c9948185b1c9958591e48191a5cd8589b195960621b608482015260a4016106fe565b60006101308190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061106c5761106c6128b2565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6110b4611246565b6001600160a01b0381166111195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106fe565b61073a8161170d565b6001600160a01b0383166111845760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106fe565b6001600160a01b0382166111e55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106fe565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6033546001600160a01b031633146107775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fe565b6001600160a01b03821660008181526101316020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b600061130d8484610f2d565b9050600019811461137557818110156113685760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106fe565b6113758484848403611122565b50505050565b6001600160a01b0383166113df5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106fe565b6001600160a01b0382166114415760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106fe565b61144c8383836119ef565b6001600160a01b038316600090815260656020526040902054818110156114c45760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106fe565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906115249086815260200190565b60405180910390a3611375848484611acd565b600061067f611aff565b81546000908181600581111561159b57600061155c84611b73565b61156690856128e1565b600088815260209020909150869082015463ffffffff16111561158b57809150611599565b61159681600161289a565b92505b505b808210156115e85760006115af8383611c58565b600088815260209020909150869082015463ffffffff1611156115d4578091506115e2565b6115df81600161289a565b92505b5061159b565b8015611614576000868152602090208101600019015464010000000090046001600160e01b0316611617565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611375828483611c73565b600063ffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016106fe565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546105a09061284f565b6060609a80546105a09061284f565b600065ffffffffffff8211156117095760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b60648201526084016106fe565b6001600160a01b03821660008181526101326020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016112f5565b600061075f61184a611537565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600061187b87878787611db0565b9150915061188881611e74565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b600054610100900460ff166118e15760405162461bcd60e51b81526004016106fe906128f8565b610777611fc2565b600054610100900460ff166119105760405162461bcd60e51b81526004016106fe906128f8565b61064d8282611ff2565b600054610100900460ff166119415760405162461bcd60e51b81526004016106fe906128f8565b61073a81604051806040016040528060018152602001603160f81b815250612040565b61196e828261209d565b6067546001600160e01b0310156119e05760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b60648201526084016106fe565b6113756101006121728361217e565b610130544211611ac8576001600160a01b0383166000908152610131602052604090205460ff1680611a3a57506001600160a01b0382166000908152610132602052604090205460ff165b80611a4c57506001600160a01b038316155b611ac85760405162461bcd60e51b815260206004820152604160248201527f4261636b696e67456967656e2e5f6265666f7265546f6b656e5472616e73666560448201527f723a2066726f6d206f7220746f206d7573742062652077686974656c697374656064820152601960fa1b608482015260a4016106fe565b505050565b6001600160a01b03838116600090815260fe6020526040808220548584168352912054611ac892918216911683611c73565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611b2a6122f3565b611b3261234c565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600081611b8257506000919050565b60006001611b8f8461237d565b901c6001901b90506001818481611ba857611ba8612943565b048201901c90506001818481611bc057611bc0612943565b048201901c90506001818481611bd857611bd8612943565b048201901c90506001818481611bf057611bf0612943565b048201901c90506001818481611c0857611c08612943565b048201901c90506001818481611c2057611c20612943565b048201901c90506001818481611c3857611c38612943565b048201901c905061072981828581611c5257611c52612943565b04612411565b6000611c676002848418612959565b6107299084841661289a565b816001600160a01b0316836001600160a01b031614158015611c955750600081115b15611ac8576001600160a01b03831615611d23576001600160a01b038316600090815260ff602052604081208190611cd0906124278561217e565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d18929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611ac8576001600160a01b038216600090815260ff602052604081208190611d59906121728561217e565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611da1929190918252602082015260400190565b60405180910390a25050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611de75750600090506003611e6b565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611e3b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611e6457600060019250925050611e6b565b9150600090505b94509492505050565b6000816004811115611e8857611e8861297b565b1415611e915750565b6001816004811115611ea557611ea561297b565b1415611ef35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106fe565b6002816004811115611f0757611f0761297b565b1415611f555760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106fe565b6003816004811115611f6957611f6961297b565b141561073a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106fe565b600054610100900460ff16611fe95760405162461bcd60e51b81526004016106fe906128f8565b6107773361170d565b600054610100900460ff166120195760405162461bcd60e51b81526004016106fe906128f8565b815161202c90606890602085019061249c565b508051611ac890606990602084019061249c565b600054610100900460ff166120675760405162461bcd60e51b81526004016106fe906128f8565b815161207a90609990602085019061249c565b50805161208e90609a90602084019061249c565b50506000609781905560985550565b6001600160a01b0382166120f35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106fe565b6120ff600083836119ef565b8060676000828254612111919061289a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361064d60008383611acd565b6000610729828461289a565b825460009081908181156121cb5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b031660208201526121e0565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061220084868863ffffffff16565b925060008211801561222a575061221561089d565b65ffffffffffff16816000015163ffffffff16145b1561226f5761223883612433565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff9092169190911790556122e9565b86604051806040016040528061229361228661089d565b65ffffffffffff166116a4565b63ffffffff1681526020016122a786612433565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b6000806122fe61175f565b805190915015612315578051602090910120919050565b60975480156123245792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b60008061235761176e565b80519091501561236e578051602090910120919050565b60985480156123245792915050565b600080608083901c1561239257608092831c92015b604083901c156123a457604092831c92015b602083901c156123b657602092831c92015b601083901c156123c857601092831c92015b600883901c156123da57600892831c92015b600483901c156123ec57600492831c92015b600283901c156123fe57600292831c92015b600183901c1561075f5760010192915050565b60008183106124205781610729565b5090919050565b600061072982846128e1565b60006001600160e01b038211156117095760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016106fe565b8280546124a89061284f565b90600052602060002090601f0160209004810192826124ca5760008555612510565b82601f106124e357805160ff1916838001178555612510565b82800160010185558215612510579182015b828111156125105782518255916020019190600101906124f5565b506117099291505b808211156117095760008155600101612518565b80356001600160a01b038116811461254357600080fd5b919050565b60006020828403121561255a57600080fd5b6107298261252c565b6000815180845260005b818110156125895760208185018101518683018201520161256d565b8181111561259b576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006107296020830184612563565b600080604083850312156125d657600080fd5b6125df8361252c565b946020939093013593505050565b6000806040838503121561260057600080fd5b6126098361252c565b91506020830135801515811461261e57600080fd5b809150509250929050565b60008060006060848603121561263e57600080fd5b6126478461252c565b92506126556020850161252c565b9150604084013590509250925092565b60ff60f81b881681526000602060e08184015261268560e084018a612563565b8381036040850152612697818a612563565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b818110156126e9578351835292840192918401916001016126cd565b50909c9b505050505050505050505050565b60006020828403121561270d57600080fd5b5035919050565b803560ff8116811461254357600080fd5b60008060008060008060c0878903121561273e57600080fd5b6127478761252c565b9550602087013594506040870135935061276360608801612714565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561279857600080fd5b6127a18861252c565b96506127af6020890161252c565b955060408801359450606088013593506127cb60808901612714565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156127fa57600080fd5b6128038361252c565b91506128116020840161252c565b90509250929050565b6000806040838503121561282d57600080fd5b6128368361252c565b9150602083013563ffffffff8116811461261e57600080fd5b600181811c9082168061286357607f821691505b602082108114156118b457634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156128ad576128ad612884565b500190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156128da57600080fd5b5051919050565b6000828210156128f3576128f3612884565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261297657634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220efc3f106504e0c28cb8cafc81d7a3da2bf482a3d97d965d614af2702bacb7b2e64736f6c634300080c0033", } // BackingEigenABI 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 cd39d2a6e..7ba816ac7 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: "[]", - Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212201adc8a413c11b386c94f26ec67ec0705a5183c0315dc152177969f46e95a590c64736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209b60f9734813d3adba40c977a5c97c5a7fe877fca0f9071ac0cdc7fb4fbaf94764736f6c634300080c0033", } // BytesLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EIP1271SignatureUtils/binding.go b/pkg/bindings/EIP1271SignatureUtils/binding.go index d35557db4..d5903bc37 100644 --- a/pkg/bindings/EIP1271SignatureUtils/binding.go +++ b/pkg/bindings/EIP1271SignatureUtils/binding.go @@ -32,7 +32,7 @@ var ( // EIP1271SignatureUtilsMetaData contains all meta data concerning the EIP1271SignatureUtils contract. var EIP1271SignatureUtilsMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212206196d746b114be2540a34e44ab801584f797eebacbfc3a32974215e1078f947464736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209832fdd04d36d0bbe78b7b9457ca6759978d3e81a33602cb69f518c735ee384664736f6c634300080c0033", } // EIP1271SignatureUtilsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Eigen/binding.go b/pkg/bindings/Eigen/binding.go index d62113167..3000876ed 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: "0x60a06040523480156200001157600080fd5b50604051620064cc380380620064cc8339818101604052810190620000379190620001c6565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250506200007b6200008260201b60201c565b50620002dc565b600060019054906101000a900460ff1615620000d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000cc906200027f565b60405180910390fd5b60ff801660008054906101000a900460ff1660ff1614620001465760ff6000806101000a81548160ff021916908360ff1602179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860ff6040516200013d9190620002bf565b60405180910390a15b565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200017a826200014d565b9050919050565b60006200018e826200016d565b9050919050565b620001a08162000181565b8114620001ac57600080fd5b50565b600081519050620001c08162000195565b92915050565b600060208284031215620001df57620001de62000148565b5b6000620001ef84828501620001af565b91505092915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320696e69746960008201527f616c697a696e6700000000000000000000000000000000000000000000000000602082015250565b600062000267602783620001f8565b9150620002748262000209565b604082019050919050565b600060208201905081810360008301526200029a8162000258565b9050919050565b600060ff82169050919050565b620002b981620002a1565b82525050565b6000602082019050620002d66000830184620002ae565b92915050565b6080516161c66200030660003960008181610ce901528181611bd70152611cb701526161c66000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e1461078b578063de0e9a3e146107bb578063ea598cb0146107d7578063eb415f45146107f3578063f1127ed8146107fd578063f2fde38b1461082d5761025e565b8063a9059cbb146106eb578063aad41a411461071b578063b8c2559414610737578063c3cda52014610753578063d505accf1461076f5761025e565b806395d89b411161010a57806395d89b41146106335780639ab24eb0146106515780639aec4bae14610681578063a457c2d71461069f578063a7d1195d146106cf5761025e565b806381b971611461057357806384b0196e146105a35780638da5cb5b146105c75780638e539e8c146105e557806391ddadf4146106155761025e565b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c1461048d5780636fcfff45146104a957806370a08231146104d9578063715018a61461050957806378aa33ba146105135780637ecebe00146105435761025e565b80633a46b1a8146103c15780633f4da4c6146103f15780634bf5d7e91461040f578063539571251461042d578063587cde1e1461045d5761025e565b80631ffacdef116102265780631ffacdef1461030957806323b872dd14610325578063313ce567146103555780633644e5151461037357806339509351146103915761025e565b80630455e6941461026357806306fdde0314610293578063095ea7b3146102b15780631249c58b146102e157806318160ddd146102eb575b600080fd5b61027d60048036038101906102789190613e75565b610849565b60405161028a9190613ebd565b60405180910390f35b61029b61086a565b6040516102a89190613f71565b60405180910390f35b6102cb60048036038101906102c69190613fc9565b6108fc565b6040516102d89190613ebd565b60405180910390f35b6102e961091f565b005b6102f3610b0a565b6040516103009190614018565b60405180910390f35b610323600480360381019061031e919061405f565b610b14565b005b61033f600480360381019061033a919061409f565b610bc6565b60405161034c9190613ebd565b60405180910390f35b61035d610bf5565b60405161036a919061410e565b60405180910390f35b61037b610bfe565b6040516103889190614142565b60405180910390f35b6103ab60048036038101906103a69190613fc9565b610c0d565b6040516103b89190613ebd565b60405180910390f35b6103db60048036038101906103d69190613fc9565b610c44565b6040516103e89190614018565b60405180910390f35b6103f9610ce7565b60405161040691906141bc565b60405180910390f35b610417610d0b565b6040516104249190613f71565b60405180910390f35b61044760048036038101906104429190613e75565b610d48565b6040516104549190614018565b60405180910390f35b61047760048036038101906104729190613e75565b610d61565b60405161048491906141e6565b60405180910390f35b6104a760048036038101906104a29190613e75565b610dca565b005b6104c360048036038101906104be9190613e75565b610dde565b6040516104d09190614220565b60405180910390f35b6104f360048036038101906104ee9190613e75565b610e32565b6040516105009190614018565b60405180910390f35b610511610e7b565b005b61052d60048036038101906105289190613e75565b610e8f565b60405161053a9190613ebd565b60405180910390f35b61055d60048036038101906105589190613e75565b610eb0565b60405161056a9190614018565b60405180910390f35b61058d60048036038101906105889190613e75565b610f00565b60405161059a9190614018565b60405180910390f35b6105ab610f19565b6040516105be9796959493929190614334565b60405180910390f35b6105cf61101a565b6040516105dc91906141e6565b60405180910390f35b6105ff60048036038101906105fa91906143b8565b611044565b60405161060c9190614018565b60405180910390f35b61061d6110aa565b60405161062a9190614406565b60405180910390f35b61063b6110ba565b6040516106489190613f71565b60405180910390f35b61066b60048036038101906106669190613e75565b61114c565b6040516106789190614018565b60405180910390f35b610689611254565b6040516106969190614018565b60405180910390f35b6106b960048036038101906106b49190613fc9565b61125b565b6040516106c69190613ebd565b60405180910390f35b6106e960048036038101906106e4919061462c565b6112d2565b005b61070560048036038101906107009190613fc9565b61176d565b6040516107129190613ebd565b60405180910390f35b61073560048036038101906107309190614798565b611790565b005b610751600480360381019061074c919061405f565b61184b565b005b61076d60048036038101906107689190614871565b6118fd565b005b610789600480360381019061078491906148fe565b611a01565b005b6107a560048036038101906107a091906149a0565b611b43565b6040516107b29190614018565b60405180910390f35b6107d560048036038101906107d091906143b8565b611bca565b005b6107f160048036038101906107ec91906143b8565b611cb5565b005b6107fb611da2565b005b61081760048036038101906108129190614a0c565b611e46565b6040516108249190614ac1565b60405180910390f35b61084760048036038101906108429190613e75565b611f56565b005b6101336020528060005260406000206000915054906101000a900460ff1681565b60606068805461087990614b0b565b80601f01602080910402602001604051908101604052809291908181526020018280546108a590614b0b565b80156108f25780601f106108c7576101008083540402835291602001916108f2565b820191906000526020600020905b8154815290600101906020018083116108d557829003601f168201915b5050505050905090565b600080610907611fda565b9050610914818585611fe2565b600191505092915050565b600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990614baf565b60405180910390fd5b61013060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544211610a24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1b90614c41565b60405180910390fd5b600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600061013160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610ab933826121ad565b3373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051610aff9190614018565b60405180910390a250565b6000606754905090565b610b1c61223b565b8061013360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227182604051610bba9190613ebd565b60405180910390a25050565b600080610bd1611fda565b9050610bde8582856122b9565b610be9858585612345565b60019150509392505050565b60006012905090565b6000610c086125c0565b905090565b600080610c18611fda565b9050610c39818585610c2a8589611b43565b610c349190614c90565b611fe2565b600191505092915050565b6000610c4e6110aa565b65ffffffffffff168210610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614d32565b60405180910390fd5b610cdf60ff60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836125cf565b905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606040518060400160405280600e81526020017f6d6f64653d74696d657374616d70000000000000000000000000000000000000815250905090565b6101306020528060005260406000206000915090505481565b600060fe60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610ddb610dd5611fda565b82612717565b50565b6000610e2b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612831565b9050919050565b6000606560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e8361223b565b610e8d6000612884565b565b6101346020528060005260406000206000915054906101000a900460ff1681565b6000610ef960cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061294a565b9050919050565b6101316020528060005260406000206000915090505481565b6000606080600080600060606000801b609754148015610f3d57506000801b609854145b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7390614d9e565b60405180910390fd5b610f84612958565b610f8c6129ea565b46306000801b600067ffffffffffffffff811115610fad57610fac614426565b5b604051908082528060200260200182016040528015610fdb5781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061104e6110aa565b65ffffffffffff168210611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e90614d32565b60405180910390fd5b6110a3610100836125cf565b9050919050565b60006110b542612a7c565b905090565b6060606980546110c990614b0b565b80601f01602080910402602001604051908101604052809291908181526020018280546110f590614b0b565b80156111425780601f1061111757610100808354040283529160200191611142565b820191906000526020600020905b81548152906001019060200180831161112557829003601f168201915b5050505050905090565b60008060ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090506000811461122b5760ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018203815481106111f0576111ef614dbe565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661122e565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6101325481565b600080611266611fda565b905060006112748286611b43565b9050838110156112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614e5f565b60405180910390fd5b6112c68286868403611fe2565b60019250505092915050565b60008060019054906101000a900460ff161590508080156113035750600160008054906101000a900460ff1660ff16105b80611330575061131230612ad1565b15801561132f5750600160008054906101000a900460ff1660ff16145b5b61136f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136690614ef1565b60405180910390fd5b60016000806101000a81548160ff021916908360ff16021790555080156113ac576001600060016101000a81548160ff0219169083151502179055505b6113b4612af4565b6114286040518060400160405280600581526020017f456967656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612b4d565b61143185612884565b61146f6040518060400160405280600581526020017f454947454e000000000000000000000000000000000000000000000000000000815250612baa565b82518451146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa90614fa9565b60405180910390fd5b81518451146114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee90615061565b60405180910390fd5b60005b84518110156116e45783818151811061151657611515614dbe565b5b6020026020010151610131600087848151811061153657611535614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082818151811061158f5761158e614dbe565b5b602002602001015161013060008784815181106115af576115ae614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001610133600087848151811061160f5761160e614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555084818151811061167b5761167a614dbe565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227160016040516116c99190613ebd565b60405180910390a280806116dc90615081565b9150506114fa565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101328190555080156117665760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161175d9190615105565b60405180910390a15b5050505050565b600080611778611fda565b9050611785818585612345565b600191505092915050565b8181905084849050146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90615192565b60405180910390fd5b60005b8484905081101561184457611831338686848181106117fd576117fc614dbe565b5b90506020020160208101906118129190613e75565b85858581811061182557611824614dbe565b5b90506020020135612345565b808061183c90615081565b9150506117db565b5050505050565b61185361223b565b8061013460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b826040516118f19190613ebd565b60405180910390a25050565b83421115611940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611937906151fe565b60405180910390fd5b60006119a261199a7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf89898960405160200161197f949392919061521e565b60405160208183030381529060405280519060200120612c3b565b858585612c55565b90506119ad81612c80565b86146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e5906152af565b60405180910390fd5b6119f88188612717565b50505050505050565b83421115611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b9061531b565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888611a738c612c80565b89604051602001611a899695949392919061533b565b6040516020818303038152906040528051906020012090506000611aac82612c3b565b90506000611abc82878787612c55565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b23906153e8565b60405180910390fd5b611b378a8a8a611fe2565b50505050505050505050565b6000606660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611bd5333083612345565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611c30929190615408565b6020604051808303816000875af1158015611c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c739190615446565b611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906154e5565b60405180910390fd5b50565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611d1293929190615505565b6020604051808303816000875af1158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d559190615446565b611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b906155ae565b60405180910390fd5b611d9f303383612345565b50565b611daa61223b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101325414611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690615666565b60405180910390fd5b6000610132819055507f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f6460405160405180910390a1565b611e4e613d22565b60ff60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110611ea557611ea4614dbe565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b611f5e61223b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc5906156f8565b60405180910390fd5b611fd781612884565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612052576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120499061578a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b99061581c565b60405180910390fd5b80606660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516121a09190614018565b60405180910390a3505050565b6121b78282612cde565b6121bf612e36565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166121e5610b0a565b1115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d906158ae565b60405180910390fd5b612235610100612e5a83612e70565b50505050565b612243611fda565b73ffffffffffffffffffffffffffffffffffffffff1661226161101a565b73ffffffffffffffffffffffffffffffffffffffff16146122b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ae9061591a565b60405180910390fd5b565b60006122c58484611b43565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461233f5781811015612331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232890615986565b60405180910390fd5b61233e8484848403611fe2565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ac90615a18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90615aaa565b60405180910390fd5b61243083838361314b565b6000606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ae90615b3c565b60405180910390fd5b818103606560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081606560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516125a79190614018565b60405180910390a36125ba8484846132eb565b50505050565b60006125ca613316565b905090565b6000808380549050905060008082905060058311156126455760006125f38461337a565b846125fe9190615b5c565b90508561260b8883613474565b60000160009054906101000a900463ffffffff1663ffffffff16111561263357809150612643565b6001816126409190614c90565b92505b505b5b808210156126a557600061265a8383613489565b9050856126678883613474565b60000160009054906101000a900463ffffffff1663ffffffff16111561268f5780915061269f565b60018161269c9190614c90565b92505b50612646565b600081146126eb576126ba8660018303613474565b60000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126ee565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935050505092915050565b600061272283610d61565b9050600061272f84610e32565b90508260fe60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a461282b8284836134af565b50505050565b600063ffffffff801682111561287c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287390615c02565b60405180910390fd5b819050919050565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b60606099805461296790614b0b565b80601f016020809104026020016040519081016040528092919081815260200182805461299390614b0b565b80156129e05780601f106129b5576101008083540402835291602001916129e0565b820191906000526020600020905b8154815290600101906020018083116129c357829003601f168201915b5050505050905090565b6060609a80546129f990614b0b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a2590614b0b565b8015612a725780601f10612a4757610100808354040283529160200191612a72565b820191906000526020600020905b815481529060010190602001808311612a5557829003601f168201915b5050505050905090565b600065ffffffffffff8016821115612ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac090615c94565b60405180910390fd5b819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600060019054906101000a900460ff16612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a90615d26565b60405180910390fd5b612b4b6136a8565b565b600060019054906101000a900460ff16612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390615d26565b60405180910390fd5b612ba68282613709565b5050565b600060019054906101000a900460ff16612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090615d26565b60405180910390fd5b612c38816040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525061378a565b50565b6000612c4e612c486125c0565b8361381f565b9050919050565b6000806000612c6687878787613860565b91509150612c7381613943565b8192505050949350505050565b60008060cb60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050612ccd8161294a565b9150612cd881613ab1565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590615d92565b60405180910390fd5b612d5a6000838361314b565b8060676000828254612d6c9190614c90565b9250508190555080606560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e1e9190614018565b60405180910390a3612e32600083836132eb565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008183612e689190614c90565b905092915050565b6000806000858054905090506000808214612f3657612e928760018403613474565b6040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050612f72565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152505b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169350612fa784868863ffffffff16565b9250600082118015612fd15750612fbc6110aa565b65ffffffffffff16816000015163ffffffff16145b1561304257612fdf83613ac7565b612fec8860018503613474565b60000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613141565b8660405180604001604052806130666130596110aa565b65ffffffffffff16612831565b63ffffffff16815260200161307a86613ac7565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b5050935093915050565b6101325442116132db57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806131bb57503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806131f157503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80613246575061013360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061329b575061013460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6132da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d190615e24565b60405180910390fd5b5b6132e6838383613b32565b505050565b6132f6838383613b37565b61331161330284610d61565b61330b84610d61565b836134af565b505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613341613b3c565b613349613ba7565b463060405160200161335f959493929190615e44565b60405160208183030381529060405280519060200120905090565b60008082141561338d576000905061346f565b6000600161339a84613c12565b901c6001901b905060018184816133b4576133b3615e97565b5b048201901c905060018184816133cd576133cc615e97565b5b048201901c905060018184816133e6576133e5615e97565b5b048201901c905060018184816133ff576133fe615e97565b5b048201901c9050600181848161341857613417615e97565b5b048201901c9050600181848161343157613430615e97565b5b048201901c9050600181848161344a57613449615e97565b5b048201901c905061346b8182858161346557613464615e97565b5b04613cf3565b9150505b919050565b60008260005281602060002001905092915050565b6000600282841861349a9190615ec6565b8284166134a79190614c90565b905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156134eb5750600081115b156136a357600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135c95760008061357260ff60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613d0c85612e70565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516135be929190615ef7565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146136a25760008061364b60ff60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612e5a85612e70565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051613697929190615ef7565b60405180910390a250505b5b505050565b600060019054906101000a900460ff166136f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ee90615d26565b60405180910390fd5b613707613702611fda565b612884565b565b600060019054906101000a900460ff16613758576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374f90615d26565b60405180910390fd5b816068908051906020019061376e929190613d60565b508060699080519060200190613785929190613d60565b505050565b600060019054906101000a900460ff166137d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137d090615d26565b60405180910390fd5b81609990805190602001906137ef929190613d60565b5080609a9080519060200190613806929190613d60565b506000801b6097819055506000801b6098819055505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561389b57600060039150915061393a565b6000600187878787604051600081526020016040526040516138c09493929190615f20565b6020604051602081039080840390855afa1580156138e2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156139315760006001925092505061393a565b80600092509250505b94509492505050565b6000600481111561395757613956615f65565b5b81600481111561396a57613969615f65565b5b141561397557613aae565b6001600481111561398957613988615f65565b5b81600481111561399c5761399b615f65565b5b14156139dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d490615fe0565b60405180910390fd5b600260048111156139f1576139f0615f65565b5b816004811115613a0457613a03615f65565b5b1415613a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3c9061604c565b60405180910390fd5b60036004811115613a5957613a58615f65565b5b816004811115613a6c57613a6b615f65565b5b1415613aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa4906160de565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115613b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2190616170565b60405180910390fd5b819050919050565b505050565b505050565b600080613b47612958565b9050600081511115613b63578080519060200120915050613ba4565b600060975490506000801b8114613b7e578092505050613ba4565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080613bb26129ea565b9050600081511115613bce578080519060200120915050613c0f565b600060985490506000801b8114613be9578092505050613c0f565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470925050505b90565b600080600090506000608084901c1115613c3457608083901c92506080810190505b6000604084901c1115613c4f57604083901c92506040810190505b6000602084901c1115613c6a57602083901c92506020810190505b6000601084901c1115613c8557601083901c92506010810190505b6000600884901c1115613ca057600883901c92506008810190505b6000600484901c1115613cbb57600483901c92506004810190505b6000600284901c1115613cd657600283901c92506002810190505b6000600184901c1115613cea576001810190505b80915050919050565b6000818310613d025781613d04565b825b905092915050565b60008183613d1a9190615b5c565b905092915050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b828054613d6c90614b0b565b90600052602060002090601f016020900481019282613d8e5760008555613dd5565b82601f10613da757805160ff1916838001178555613dd5565b82800160010185558215613dd5579182015b82811115613dd4578251825591602001919060010190613db9565b5b509050613de29190613de6565b5090565b5b80821115613dff576000816000905550600101613de7565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613e4282613e17565b9050919050565b613e5281613e37565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613e0d565b5b6000613e9984828501613e60565b91505092915050565b60008115159050919050565b613eb781613ea2565b82525050565b6000602082019050613ed26000830184613eae565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f12578082015181840152602081019050613ef7565b83811115613f21576000848401525b50505050565b6000601f19601f8301169050919050565b6000613f4382613ed8565b613f4d8185613ee3565b9350613f5d818560208601613ef4565b613f6681613f27565b840191505092915050565b60006020820190508181036000830152613f8b8184613f38565b905092915050565b6000819050919050565b613fa681613f93565b8114613fb157600080fd5b50565b600081359050613fc381613f9d565b92915050565b60008060408385031215613fe057613fdf613e0d565b5b6000613fee85828601613e60565b9250506020613fff85828601613fb4565b9150509250929050565b61401281613f93565b82525050565b600060208201905061402d6000830184614009565b92915050565b61403c81613ea2565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b6000806040838503121561407657614075613e0d565b5b600061408485828601613e60565b92505060206140958582860161404a565b9150509250929050565b6000806000606084860312156140b8576140b7613e0d565b5b60006140c686828701613e60565b93505060206140d786828701613e60565b92505060406140e886828701613fb4565b9150509250925092565b600060ff82169050919050565b614108816140f2565b82525050565b600060208201905061412360008301846140ff565b92915050565b6000819050919050565b61413c81614129565b82525050565b60006020820190506141576000830184614133565b92915050565b6000819050919050565b600061418261417d61417884613e17565b61415d565b613e17565b9050919050565b600061419482614167565b9050919050565b60006141a682614189565b9050919050565b6141b68161419b565b82525050565b60006020820190506141d160008301846141ad565b92915050565b6141e081613e37565b82525050565b60006020820190506141fb60008301846141d7565b92915050565b600063ffffffff82169050919050565b61421a81614201565b82525050565b60006020820190506142356000830184614211565b92915050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6142708161423b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6142ab81613f93565b82525050565b60006142bd83836142a2565b60208301905092915050565b6000602082019050919050565b60006142e182614276565b6142eb8185614281565b93506142f683614292565b8060005b8381101561432757815161430e88826142b1565b9750614319836142c9565b9250506001810190506142fa565b5085935050505092915050565b600060e082019050614349600083018a614267565b818103602083015261435b8189613f38565b9050818103604083015261436f8188613f38565b905061437e6060830187614009565b61438b60808301866141d7565b61439860a0830185614133565b81810360c08301526143aa81846142d6565b905098975050505050505050565b6000602082840312156143ce576143cd613e0d565b5b60006143dc84828501613fb4565b91505092915050565b600065ffffffffffff82169050919050565b614400816143e5565b82525050565b600060208201905061441b60008301846143f7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61445e82613f27565b810181811067ffffffffffffffff8211171561447d5761447c614426565b5b80604052505050565b6000614490613e03565b905061449c8282614455565b919050565b600067ffffffffffffffff8211156144bc576144bb614426565b5b602082029050602081019050919050565b600080fd5b60006144e56144e0846144a1565b614486565b90508083825260208201905060208402830185811115614508576145076144cd565b5b835b81811015614531578061451d8882613e60565b84526020840193505060208101905061450a565b5050509392505050565b600082601f8301126145505761454f614421565b5b81356145608482602086016144d2565b91505092915050565b600067ffffffffffffffff82111561458457614583614426565b5b602082029050602081019050919050565b60006145a86145a384614569565b614486565b905080838252602082019050602084028301858111156145cb576145ca6144cd565b5b835b818110156145f457806145e08882613fb4565b8452602084019350506020810190506145cd565b5050509392505050565b600082601f83011261461357614612614421565b5b8135614623848260208601614595565b91505092915050565b6000806000806080858703121561464657614645613e0d565b5b600061465487828801613e60565b945050602085013567ffffffffffffffff81111561467557614674613e12565b5b6146818782880161453b565b935050604085013567ffffffffffffffff8111156146a2576146a1613e12565b5b6146ae878288016145fe565b925050606085013567ffffffffffffffff8111156146cf576146ce613e12565b5b6146db878288016145fe565b91505092959194509250565b600080fd5b60008083601f84011261470257614701614421565b5b8235905067ffffffffffffffff81111561471f5761471e6146e7565b5b60208301915083602082028301111561473b5761473a6144cd565b5b9250929050565b60008083601f84011261475857614757614421565b5b8235905067ffffffffffffffff811115614775576147746146e7565b5b602083019150836020820283011115614791576147906144cd565b5b9250929050565b600080600080604085870312156147b2576147b1613e0d565b5b600085013567ffffffffffffffff8111156147d0576147cf613e12565b5b6147dc878288016146ec565b9450945050602085013567ffffffffffffffff8111156147ff576147fe613e12565b5b61480b87828801614742565b925092505092959194509250565b614822816140f2565b811461482d57600080fd5b50565b60008135905061483f81614819565b92915050565b61484e81614129565b811461485957600080fd5b50565b60008135905061486b81614845565b92915050565b60008060008060008060c0878903121561488e5761488d613e0d565b5b600061489c89828a01613e60565b96505060206148ad89828a01613fb4565b95505060406148be89828a01613fb4565b94505060606148cf89828a01614830565b93505060806148e089828a0161485c565b92505060a06148f189828a0161485c565b9150509295509295509295565b600080600080600080600060e0888a03121561491d5761491c613e0d565b5b600061492b8a828b01613e60565b975050602061493c8a828b01613e60565b965050604061494d8a828b01613fb4565b955050606061495e8a828b01613fb4565b945050608061496f8a828b01614830565b93505060a06149808a828b0161485c565b92505060c06149918a828b0161485c565b91505092959891949750929550565b600080604083850312156149b7576149b6613e0d565b5b60006149c585828601613e60565b92505060206149d685828601613e60565b9150509250929050565b6149e981614201565b81146149f457600080fd5b50565b600081359050614a06816149e0565b92915050565b60008060408385031215614a2357614a22613e0d565b5b6000614a3185828601613e60565b9250506020614a42858286016149f7565b9150509250929050565b614a5581614201565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b614a8c81614a5b565b82525050565b604082016000820151614aa86000850182614a4c565b506020820151614abb6020850182614a83565b50505050565b6000604082019050614ad66000830184614a92565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b2357607f821691505b60208210811415614b3757614b36614adc565b5b50919050565b7f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960008201527f6e74696e6720616c6c6f77616e63650000000000000000000000000000000000602082015250565b6000614b99602f83613ee3565b9150614ba482614b3d565b604082019050919050565b60006020820190508181036000830152614bc881614b8c565b9050919050565b7f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c60008201527f6c6f77656420746f206d696e7420796574000000000000000000000000000000602082015250565b6000614c2b603183613ee3565b9150614c3682614bcf565b604082019050919050565b60006020820190508181036000830152614c5a81614c1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c9b82613f93565b9150614ca683613f93565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614cdb57614cda614c61565b5b828201905092915050565b7f4552433230566f7465733a20667574757265206c6f6f6b757000000000000000600082015250565b6000614d1c601983613ee3565b9150614d2782614ce6565b602082019050919050565b60006020820190508181036000830152614d4b81614d0f565b9050919050565b7f4549503731323a20556e696e697469616c697a65640000000000000000000000600082015250565b6000614d88601583613ee3565b9150614d9382614d52565b602082019050919050565b60006020820190508181036000830152614db781614d7b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000614e49602583613ee3565b9150614e5482614ded565b604082019050919050565b60006020820190508181036000830152614e7881614e3c565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000614edb602e83613ee3565b9150614ee682614e7f565b604082019050919050565b60006020820190508181036000830152614f0a81614ece565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960008201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b6000614f93604783613ee3565b9150614f9e82614f11565b606082019050919050565b60006020820190508181036000830152614fc281614f86565b9050919050565b7f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960008201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d6560208201527f206c656e67746800000000000000000000000000000000000000000000000000604082015250565b600061504b604783613ee3565b915061505682614fc9565b606082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b600061508c82613f93565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156150bf576150be614c61565b5b600182019050919050565b6000819050919050565b60006150ef6150ea6150e5846150ca565b61415d565b6140f2565b9050919050565b6150ff816150d4565b82525050565b600060208201905061511a60008301846150f6565b92915050565b7f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160008201527f6d6f756e7473206d757374206265207468652073616d65206c656e6774680000602082015250565b600061517c603e83613ee3565b915061518782615120565b604082019050919050565b600060208201905081810360008301526151ab8161516f565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b60006151e8601d83613ee3565b91506151f3826151b2565b602082019050919050565b60006020820190508181036000830152615217816151db565b9050919050565b60006080820190506152336000830187614133565b61524060208301866141d7565b61524d6040830185614009565b61525a6060830184614009565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000615299601983613ee3565b91506152a482615263565b602082019050919050565b600060208201905081810360008301526152c88161528c565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000615305601d83613ee3565b9150615310826152cf565b602082019050919050565b60006020820190508181036000830152615334816152f8565b9050919050565b600060c0820190506153506000830189614133565b61535d60208301886141d7565b61536a60408301876141d7565b6153776060830186614009565b6153846080830185614009565b61539160a0830184614009565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b60006153d2601e83613ee3565b91506153dd8261539c565b602082019050919050565b60006020820190508181036000830152615401816153c5565b9050919050565b600060408201905061541d60008301856141d7565b61542a6020830184614009565b9392505050565b60008151905061544081614033565b92915050565b60006020828403121561545c5761545b613e0d565b5b600061546a84828501615431565b91505092915050565b7f456967656e2e756e777261703a2062454947454e207472616e7366657220666160008201527f696c656400000000000000000000000000000000000000000000000000000000602082015250565b60006154cf602483613ee3565b91506154da82615473565b604082019050919050565b600060208201905081810360008301526154fe816154c2565b9050919050565b600060608201905061551a60008301866141d7565b61552760208301856141d7565b6155346040830184614009565b949350505050565b7f456967656e2e777261703a2062454947454e207472616e73666572206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000615598602283613ee3565b91506155a38261553c565b604082019050919050565b600060208201905081810360008301526155c78161558b565b9050919050565b7f456967656e2e64697361626c655472616e736665725265737472696374696f6e60008201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260208201527f656164792064697361626c656400000000000000000000000000000000000000604082015250565b6000615650604d83613ee3565b915061565b826155ce565b606082019050919050565b6000602082019050818103600083015261567f81615643565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006156e2602683613ee3565b91506156ed82615686565b604082019050919050565b60006020820190508181036000830152615711816156d5565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615774602483613ee3565b915061577f82615718565b604082019050919050565b600060208201905081810360008301526157a381615767565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000615806602283613ee3565b9150615811826157aa565b604082019050919050565b60006020820190508181036000830152615835816157f9565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000615898603083613ee3565b91506158a38261583c565b604082019050919050565b600060208201905081810360008301526158c78161588b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000615904602083613ee3565b915061590f826158ce565b602082019050919050565b60006020820190508181036000830152615933816158f7565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000615970601d83613ee3565b915061597b8261593a565b602082019050919050565b6000602082019050818103600083015261599f81615963565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615a02602583613ee3565b9150615a0d826159a6565b604082019050919050565b60006020820190508181036000830152615a31816159f5565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615a94602383613ee3565b9150615a9f82615a38565b604082019050919050565b60006020820190508181036000830152615ac381615a87565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000615b26602683613ee3565b9150615b3182615aca565b604082019050919050565b60006020820190508181036000830152615b5581615b19565b9050919050565b6000615b6782613f93565b9150615b7283613f93565b925082821015615b8557615b84614c61565b5b828203905092915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000615bec602683613ee3565b9150615bf782615b90565b604082019050919050565b60006020820190508181036000830152615c1b81615bdf565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203460008201527f3820626974730000000000000000000000000000000000000000000000000000602082015250565b6000615c7e602683613ee3565b9150615c8982615c22565b604082019050919050565b60006020820190508181036000830152615cad81615c71565b9050919050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b6000615d10602b83613ee3565b9150615d1b82615cb4565b604082019050919050565b60006020820190508181036000830152615d3f81615d03565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000615d7c601f83613ee3565b9150615d8782615d46565b602082019050919050565b60006020820190508181036000830152615dab81615d6f565b9050919050565b7f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60008201527f206f7220746f206d7573742062652077686974656c6973746564000000000000602082015250565b6000615e0e603a83613ee3565b9150615e1982615db2565b604082019050919050565b60006020820190508181036000830152615e3d81615e01565b9050919050565b600060a082019050615e596000830188614133565b615e666020830187614133565b615e736040830186614133565b615e806060830185614009565b615e8d60808301846141d7565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615ed182613f93565b9150615edc83613f93565b925082615eec57615eeb615e97565b5b828204905092915050565b6000604082019050615f0c6000830185614009565b615f196020830184614009565b9392505050565b6000608082019050615f356000830187614133565b615f4260208301866140ff565b615f4f6040830185614133565b615f5c6060830184614133565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000615fca601883613ee3565b9150615fd582615f94565b602082019050919050565b60006020820190508181036000830152615ff981615fbd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616036601f83613ee3565b915061604182616000565b602082019050919050565b6000602082019050818103600083015261606581616029565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006160c8602283613ee3565b91506160d38261606c565b604082019050919050565b600060208201905081810360008301526160f7816160bb565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061615a602783613ee3565b9150616165826160fe565b604082019050919050565b600060208201905081810360008301526161898161614d565b905091905056fea264697066735822122033db7c2b5be688e3303e3b776cba47b11848c7bcbcb35c9e20d29fbd2cea926264736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b506040516200342538038062003425833981016040819052620000349162000113565b6001600160a01b0381166080526200004b62000052565b5062000145565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000111576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012657600080fd5b81516001600160a01b03811681146200013e57600080fd5b9392505050565b6080516132b66200016f6000396000818161034801528181611475015261156401526132b66000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806381b9716111610146578063a9059cbb116100c3578063dd62ed3e11610087578063dd62ed3e146105c5578063de0e9a3e146105d8578063ea598cb0146105eb578063eb415f45146105fe578063f1127ed814610606578063f2fde38b1461064357600080fd5b8063a9059cbb14610566578063aad41a4114610579578063b8c255941461058c578063c3cda5201461059f578063d505accf146105b257600080fd5b806395d89b411161010a57806395d89b411461051b5780639ab24eb0146105235780639aec4bae14610536578063a457c2d714610540578063a7d1195d1461055357600080fd5b806381b971611461049c57806384b0196e146104bd5780638da5cb5b146104d85780638e539e8c146104e957806391ddadf4146104fc57600080fd5b80633a46b1a8116101df5780635c19a95c116101a35780635c19a95c146103f95780636fcfff451461040c57806370a0823114610434578063715018a61461045d57806378aa33ba146104655780637ecebe001461048957600080fd5b80633a46b1a8146103305780633f4da4c6146103435780634bf5d7e91461038257806353957125146103ac578063587cde1e146103cd57600080fd5b80631ffacdef116102265780631ffacdef146102e057806323b872dd146102f3578063313ce567146103065780633644e51514610315578063395093511461031d57600080fd5b80630455e6941461026357806306fdde031461029c578063095ea7b3146102b15780631249c58b146102c457806318160ddd146102ce575b600080fd5b610287610271366004612b8a565b6101336020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102a4610656565b6040516102939190612bf2565b6102876102bf366004612c05565b6106e8565b6102cc610700565b005b6067545b604051908152602001610293565b6102cc6102ee366004612c3d565b61084b565b610287610301366004612c74565b6108b4565b60405160128152602001610293565b6102d26108d8565b61028761032b366004612c05565b6108e7565b6102d261033e366004612c05565b610909565b61036a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610293565b60408051808201909152600e81526d06d6f64653d74696d657374616d760941b60208201526102a4565b6102d26103ba366004612b8a565b6101306020526000908152604090205481565b61036a6103db366004612b8a565b6001600160a01b03908116600090815260fe60205260409020541690565b6102cc610407366004612b8a565b61098e565b61041f61041a366004612b8a565b61099b565b60405163ffffffff9091168152602001610293565b6102d2610442366004612b8a565b6001600160a01b031660009081526065602052604090205490565b6102cc6109c3565b610287610473366004612b8a565b6101346020526000908152604090205460ff1681565b6102d2610497366004612b8a565b6109d7565b6102d26104aa366004612b8a565b6101316020526000908152604090205481565b6104c56109f5565b6040516102939796959493929190612cb0565b6033546001600160a01b031661036a565b6102d26104f7366004612d46565b610a93565b610504610afb565b60405165ffffffffffff9091168152602001610293565b6102a4610b06565b6102d2610531366004612b8a565b610b15565b6102d26101325481565b61028761054e366004612c05565b610b97565b6102cc610561366004612e35565b610c12565b610287610574366004612c05565b61103f565b6102cc610587366004612f78565b61104d565b6102cc61059a366004612c3d565b611128565b6102cc6105ad366004612ff5565b611189565b6102cc6105c036600461304d565b6112bf565b6102d26105d33660046130b7565b611423565b6102cc6105e6366004612d46565b61144e565b6102cc6105f9366004612d46565b611542565b6102cc61163b565b6106196106143660046130ea565b611704565b60408051825163ffffffff1681526020928301516001600160e01b03169281019290925201610293565b6102cc610651366004612b8a565b611788565b6060606880546106659061311f565b80601f01602080910402602001604051908101604052809291908181526020018280546106919061311f565b80156106de5780601f106106b3576101008083540402835291602001916106de565b820191906000526020600020905b8154815290600101906020018083116106c157829003601f168201915b5050505050905090565b6000336106f68185856117fe565b5060019392505050565b336000908152610131602052604090205461077a5760405162461bcd60e51b815260206004820152602f60248201527f456967656e2e6d696e743a206d73672e73656e64657220686173206e6f206d6960448201526e6e74696e6720616c6c6f77616e636560881b60648201526084015b60405180910390fd5b336000908152610130602052604090205442116107f35760405162461bcd60e51b815260206004820152603160248201527f456967656e2e6d696e743a206d73672e73656e646572206973206e6f7420616c6044820152701b1bddd959081d1bc81b5a5b9d081e595d607a1b6064820152608401610771565b336000818152610131602052604081208054919055906108139082611922565b60405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b6108536119b3565b6001600160a01b03821660008181526101336020908152604091829020805460ff191685151590811790915591519182527fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed284362227191015b60405180910390a25050565b6000336108c2858285611a0d565b6108cd858585611a81565b506001949350505050565b60006108e2611c3d565b905090565b6000336106f68185856108fa8383611423565b610904919061316a565b6117fe565b6000610913610afb565b65ffffffffffff1682106109655760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6001600160a01b038316600090815260ff602052604090206109879083611c47565b9392505050565b6109983382611d30565b50565b6001600160a01b038116600090815260ff60205260408120546109bd90611daa565b92915050565b6109cb6119b3565b6109d56000611e13565b565b6001600160a01b038116600090815260cb60205260408120546109bd565b6000606080600080600060606097546000801b148015610a155750609854155b610a595760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610771565b610a61611e65565b610a69611e74565b60408051600080825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6000610a9d610afb565b65ffffffffffff168210610aef5760405162461bcd60e51b815260206004820152601960248201527804552433230566f7465733a20667574757265206c6f6f6b757603c1b6044820152606401610771565b6109bd61010083611c47565b60006108e242611e83565b6060606980546106659061311f565b6001600160a01b038116600090815260ff60205260408120548015610b84576001600160a01b038316600090815260ff6020526040902080546000198301908110610b6257610b62613182565b60009182526020909120015464010000000090046001600160e01b0316610b87565b60005b6001600160e01b03169392505050565b60003381610ba58286611423565b905083811015610c055760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610771565b6108cd82868684036117fe565b600054610100900460ff1615808015610c325750600054600160ff909116105b80610c4c5750303b158015610c4c575060005460ff166001145b610caf5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610771565b6000805460ff191660011790558015610cd2576000805461ff0019166101001790555b610cda611eea565b610d1e6040518060400160405280600581526020016422b4b3b2b760d91b8152506040518060400160405280600581526020016422a4a3a2a760d91b815250611f19565b610d2785611e13565b610d4d6040518060400160405280600581526020016422a4a3a2a760d91b815250611f4e565b8251845114610dd45760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74696e67416c6c6f77616e636573206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b8151845114610e5b5760405162461bcd60e51b815260206004820152604760248201527f456967656e2e696e697469616c697a653a206d696e7465727320616e64206d6960448201527f6e74416c6c6f776564416674657273206d757374206265207468652073616d65606482015266040d8cadccee8d60cb1b608482015260a401610771565b60005b8451811015610fea57838181518110610e7957610e79613182565b60200260200101516101316000878481518110610e9857610e98613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110610ed657610ed6613182565b60200260200101516101306000878481518110610ef557610ef5613182565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000208190555060016101336000878481518110610f3a57610f3a613182565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550848181518110610f8b57610f8b613182565b60200260200101516001600160a01b03167fcf20b1ecb604b0e8888d579c64e8a3b10e590d45c1c2dddb393bed28436222716001604051610fd0911515815260200190565b60405180910390a280610fe281613198565b915050610e5e565b50600019610132558015611038576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6000336106f6818585611a81565b8281146110c25760405162461bcd60e51b815260206004820152603e60248201527f456967656e2e6d756c746973656e643a2072656365697665727320616e64206160448201527f6d6f756e7473206d757374206265207468652073616d65206c656e67746800006064820152608401610771565b60005b8381101561103857611116338686848181106110e3576110e3613182565b90506020020160208101906110f89190612b8a565b85858581811061110a5761110a613182565b90506020020135611a81565b8061112081613198565b9150506110c5565b6111306119b3565b6001600160a01b03821660008181526101346020908152604091829020805460ff191685151590811790915591519182527f72a561d1af7409467dae4f1e9fc52590a9335a1dda17727e2b6aa8c4db35109b91016108a8565b834211156111d95760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610771565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b0388169181019190915260608101869052608081018590526000906112539061124b9060a00160405160208183030381529060405280519060200120611f98565b858585611fc5565b905061125e81611fed565b86146112ac5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610771565b6112b68188611d30565b50505050505050565b8342111561130f5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610771565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861133e8c611fed565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061139982611f98565b905060006113a982878787611fc5565b9050896001600160a01b0316816001600160a01b03161461140c5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610771565b6114178a8a8a6117fe565b50505050505050505050565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b611459333083611a81565b60405163a9059cbb60e01b8152336004820152602481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156114c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ea91906131b3565b6109985760405162461bcd60e51b8152602060048201526024808201527f456967656e2e756e777261703a2062454947454e207472616e736665722066616044820152631a5b195960e21b6064820152608401610771565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d991906131b3565b6116305760405162461bcd60e51b815260206004820152602260248201527f456967656e2e777261703a2062454947454e207472616e73666572206661696c604482015261195960f21b6064820152608401610771565b610998303383611a81565b6116436119b3565b60001961013254146116d35760405162461bcd60e51b815260206004820152604d60248201527f456967656e2e64697361626c655472616e736665725265737472696374696f6e60448201527f733a207472616e73666572207265737472696374696f6e732061726520616c7260648201526c1958591e48191a5cd8589b1959609a1b608482015260a401610771565b60006101328190556040517f2b18986d3ba809db2f13a5d7bf17f60d357b37d9cbb55dd71cbbac8dc4060f649190a1565b60408051808201909152600080825260208201526001600160a01b038316600090815260ff60205260409020805463ffffffff841690811061174857611748613182565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090046001600160e01b0316918101919091529392505050565b6117906119b3565b6001600160a01b0381166117f55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610771565b61099881611e13565b6001600160a01b0383166118605760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610771565b6001600160a01b0382166118c15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610771565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b61192c8282612015565b6067546001600160e01b03101561199e5760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201526f766572666c6f77696e6720766f74657360801b6064820152608401610771565b6119ad6101006120ea836120f6565b50505050565b6033546001600160a01b031633146109d55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610771565b6000611a198484611423565b905060001981146119ad5781811015611a745760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610771565b6119ad84848484036117fe565b6001600160a01b038316611ae55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610771565b6001600160a01b038216611b475760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610771565b611b5283838361226b565b6001600160a01b03831660009081526065602052604090205481811015611bca5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610771565b6001600160a01b0380851660008181526065602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611c2a9086815260200190565b60405180910390a36119ad848484612365565b60006108e2612397565b815460009081816005811115611ca1576000611c628461240b565b611c6c90856131d0565b600088815260209020909150869082015463ffffffff161115611c9157809150611c9f565b611c9c81600161316a565b92505b505b80821015611cee576000611cb583836124f0565b600088815260209020909150869082015463ffffffff161115611cda57809150611ce8565b611ce581600161316a565b92505b50611ca1565b8015611d1a576000868152602090208101600019015464010000000090046001600160e01b0316611d1d565b60005b6001600160e01b03169695505050505050565b6001600160a01b03828116600081815260fe6020818152604080842080546065845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46119ad82848361250b565b600063ffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610771565b5090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060609980546106659061311f565b6060609a80546106659061311f565b600065ffffffffffff821115611e0f5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201526538206269747360d01b6064820152608401610771565b600054610100900460ff16611f115760405162461bcd60e51b8152600401610771906131e7565b6109d5612648565b600054610100900460ff16611f405760405162461bcd60e51b8152600401610771906131e7565b611f4a8282612678565b5050565b600054610100900460ff16611f755760405162461bcd60e51b8152600401610771906131e7565b61099881604051806040016040528060018152602001603160f81b8152506126c6565b60006109bd611fa5611c3d565b8360405161190160f01b8152600281019290925260228201526042902090565b6000806000611fd687878787612723565b91509150611fe3816127e7565b5095945050505050565b6001600160a01b038116600090815260cb602052604090208054600181018255905b50919050565b6001600160a01b03821661206b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610771565b6120776000838361226b565b8060676000828254612089919061316a565b90915550506001600160a01b0382166000818152606560209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611f4a60008383612365565b6000610987828461316a565b825460009081908181156121435760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090046001600160e01b03166020820152612158565b60408051808201909152600080825260208201525b905080602001516001600160e01b0316935061217884868863ffffffff16565b92506000821180156121a2575061218d610afb565b65ffffffffffff16816000015163ffffffff16145b156121e7576121b083612935565b60008881526020902083016000190180546001600160e01b03929092166401000000000263ffffffff909216919091179055612261565b86604051806040016040528061220b6121fe610afb565b65ffffffffffff16611daa565b63ffffffff16815260200161221f86612935565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b610132544211612360576001600160a01b038316158061229357506001600160a01b03831630145b806122a657506001600160a01b03821630145b806122ca57506001600160a01b0383166000908152610133602052604090205460ff165b806122ee57506001600160a01b0382166000908152610134602052604090205460ff165b6123605760405162461bcd60e51b815260206004820152603a60248201527f456967656e2e5f6265666f7265546f6b656e5472616e736665723a2066726f6d60448201527f206f7220746f206d7573742062652077686974656c69737465640000000000006064820152608401610771565b505050565b6001600160a01b03838116600090815260fe60205260408082205485841683529120546123609291821691168361250b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6123c261299e565b6123ca6129f7565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008161241a57506000919050565b6000600161242784612a28565b901c6001901b9050600181848161244057612440613232565b048201901c9050600181848161245857612458613232565b048201901c9050600181848161247057612470613232565b048201901c9050600181848161248857612488613232565b048201901c905060018184816124a0576124a0613232565b048201901c905060018184816124b8576124b8613232565b048201901c905060018184816124d0576124d0613232565b048201901c9050610987818285816124ea576124ea613232565b04612abc565b60006124ff6002848418613248565b6109879084841661316a565b816001600160a01b0316836001600160a01b03161415801561252d5750600081115b15612360576001600160a01b038316156125bb576001600160a01b038316600090815260ff60205260408120819061256890612ad2856120f6565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125b0929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615612360576001600160a01b038216600090815260ff6020526040812081906125f1906120ea856120f6565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612639929190918252602082015260400190565b60405180910390a25050505050565b600054610100900460ff1661266f5760405162461bcd60e51b8152600401610771906131e7565b6109d533611e13565b600054610100900460ff1661269f5760405162461bcd60e51b8152600401610771906131e7565b81516126b2906068906020850190612ade565b508051612360906069906020840190612ade565b600054610100900460ff166126ed5760405162461bcd60e51b8152600401610771906131e7565b8151612700906099906020850190612ade565b50805161271490609a906020840190612ade565b50506000609781905560985550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561275a57506000905060036127de565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127ae573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127d7576000600192509250506127de565b9150600090505b94509492505050565b60008160048111156127fb576127fb61326a565b14156128045750565b60018160048111156128185761281861326a565b14156128665760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610771565b600281600481111561287a5761287a61326a565b14156128c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610771565b60038160048111156128dc576128dc61326a565b14156109985760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610771565b60006001600160e01b03821115611e0f5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608401610771565b6000806129a9611e65565b8051909150156129c0578051602090910120919050565b60975480156129cf5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b600080612a02611e74565b805190915015612a19578051602090910120919050565b60985480156129cf5792915050565b600080608083901c15612a3d57608092831c92015b604083901c15612a4f57604092831c92015b602083901c15612a6157602092831c92015b601083901c15612a7357601092831c92015b600883901c15612a8557600892831c92015b600483901c15612a9757600492831c92015b600283901c15612aa957600292831c92015b600183901c156109bd5760010192915050565b6000818310612acb5781610987565b5090919050565b600061098782846131d0565b828054612aea9061311f565b90600052602060002090601f016020900481019282612b0c5760008555612b52565b82601f10612b2557805160ff1916838001178555612b52565b82800160010185558215612b52579182015b82811115612b52578251825591602001919060010190612b37565b50611e0f9291505b80821115611e0f5760008155600101612b5a565b80356001600160a01b0381168114612b8557600080fd5b919050565b600060208284031215612b9c57600080fd5b61098782612b6e565b6000815180845260005b81811015612bcb57602081850181015186830182015201612baf565b81811115612bdd576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006109876020830184612ba5565b60008060408385031215612c1857600080fd5b612c2183612b6e565b946020939093013593505050565b801515811461099857600080fd5b60008060408385031215612c5057600080fd5b612c5983612b6e565b91506020830135612c6981612c2f565b809150509250929050565b600080600060608486031215612c8957600080fd5b612c9284612b6e565b9250612ca060208501612b6e565b9150604084013590509250925092565b60ff60f81b881681526000602060e081840152612cd060e084018a612ba5565b8381036040850152612ce2818a612ba5565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612d3457835183529284019291840191600101612d18565b50909c9b505050505050505050505050565b600060208284031215612d5857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612d9e57612d9e612d5f565b604052919050565b600067ffffffffffffffff821115612dc057612dc0612d5f565b5060051b60200190565b600082601f830112612ddb57600080fd5b81356020612df0612deb83612da6565b612d75565b82815260059290921b84018101918181019086841115612e0f57600080fd5b8286015b84811015612e2a5780358352918301918301612e13565b509695505050505050565b60008060008060808587031215612e4b57600080fd5b612e5485612b6e565b935060208086013567ffffffffffffffff80821115612e7257600080fd5b818801915088601f830112612e8657600080fd5b8135612e94612deb82612da6565b81815260059190911b8301840190848101908b831115612eb357600080fd5b938501935b82851015612ed857612ec985612b6e565b82529385019390850190612eb8565b975050506040880135925080831115612ef057600080fd5b612efc89848a01612dca565b94506060880135925080831115612f1257600080fd5b5050612f2087828801612dca565b91505092959194509250565b60008083601f840112612f3e57600080fd5b50813567ffffffffffffffff811115612f5657600080fd5b6020830191508360208260051b8501011115612f7157600080fd5b9250929050565b60008060008060408587031215612f8e57600080fd5b843567ffffffffffffffff80821115612fa657600080fd5b612fb288838901612f2c565b90965094506020870135915080821115612fcb57600080fd5b50612fd887828801612f2c565b95989497509550505050565b803560ff81168114612b8557600080fd5b60008060008060008060c0878903121561300e57600080fd5b61301787612b6e565b9550602087013594506040870135935061303360608801612fe4565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561306857600080fd5b61307188612b6e565b965061307f60208901612b6e565b9550604088013594506060880135935061309b60808901612fe4565b925060a0880135915060c0880135905092959891949750929550565b600080604083850312156130ca57600080fd5b6130d383612b6e565b91506130e160208401612b6e565b90509250929050565b600080604083850312156130fd57600080fd5b61310683612b6e565b9150602083013563ffffffff81168114612c6957600080fd5b600181811c9082168061313357607f821691505b6020821081141561200f57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561317d5761317d613154565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156131ac576131ac613154565b5060010190565b6000602082840312156131c557600080fd5b815161098781612c2f565b6000828210156131e2576131e2613154565b500390565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261326557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220157f2ca25e510bd4fd72de78a17088fba90e2f64b3d97431afd1978ac5933b9664736f6c634300080c0033", } // EigenABI 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 5df4410cc..971d34dd7 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: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212204bf8cc3d692dc481489653314be9fb428918be6dc1f55e4efad2a15253360a3c64736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209aaa7fc8edeceb818497dc77ef1ff3830403a669bcd0014f8af1e039bd09c23b64736f6c634300080c0033", } // 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 97d61407c..77f0a1f86 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: "[]", - Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212209e5b8dca1f4a44a281a9fc7dc030d961fbeb9418ec87f1fabad9d90371e21da464736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122098d7de6cb617cd25193954b2c2ef2039a83bd2bc8752b047e8a5b8540f0391f864736f6c634300080c0033", } // MerkleABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Pausable/binding.go b/pkg/bindings/Pausable/binding.go index 8d81956bc..c680341d5 100644 --- a/pkg/bindings/Pausable/binding.go +++ b/pkg/bindings/Pausable/binding.go @@ -32,7 +32,7 @@ var ( // PausableMetaData contains all meta data concerning the Pausable contract. var PausableMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x608060405234801561001057600080fd5b50610ec3806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100c45780635c975abb146100f4578063886f119514610112578063fabc1cbc146101305761007d565b806310d67a2f14610082578063136439dd1461009e578063595c6a67146100ba575b600080fd5b61009c600480360381019061009791906108a7565b61014c565b005b6100b860048036038101906100b3919061090a565b610254565b005b6100c26103cd565b005b6100de60048036038101906100d99190610970565b61053d565b6040516100eb91906109b8565b60405180910390f35b6100fc610559565b60405161010991906109e2565b60405180910390f35b61011a610563565b6040516101279190610a5c565b60405180910390f35b61014a6004803603810190610145919061090a565b610587565b005b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101db9190610aa3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023f90610b53565b60405180910390fd5b61025181610726565b50565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016102ad9190610b82565b602060405180830381865afa1580156102ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ee9190610bc9565b61032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032490610c68565b60405180910390fd5b600154816001541614610375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036c90610cfa565b60405180910390fd5b806001819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d826040516103c291906109e2565b60405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346fbf68e336040518263ffffffff1660e01b81526004016104269190610b82565b602060405180830381865afa158015610443573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104679190610bc9565b6104a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161049d90610c68565b60405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001819055503373ffffffffffffffffffffffffffffffffffffffff167fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60405161053391906109e2565b60405180910390a2565b6000808260ff166001901b905080816001541614915050919050565b6000600154905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106169190610aa3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067a90610b53565b60405180910390fd5b6001541981196001541916146106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c590610d8c565b60405180910390fd5b806001819055503373ffffffffffffffffffffffffffffffffffffffff167f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c8260405161071b91906109e2565b60405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078d90610e44565b60405180910390fd5b7f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516107e7929190610e64565b60405180910390a1806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061086282610837565b9050919050565b600061087482610857565b9050919050565b61088481610869565b811461088f57600080fd5b50565b6000813590506108a18161087b565b92915050565b6000602082840312156108bd576108bc610832565b5b60006108cb84828501610892565b91505092915050565b6000819050919050565b6108e7816108d4565b81146108f257600080fd5b50565b600081359050610904816108de565b92915050565b6000602082840312156109205761091f610832565b5b600061092e848285016108f5565b91505092915050565b600060ff82169050919050565b61094d81610937565b811461095857600080fd5b50565b60008135905061096a81610944565b92915050565b60006020828403121561098657610985610832565b5b60006109948482850161095b565b91505092915050565b60008115159050919050565b6109b28161099d565b82525050565b60006020820190506109cd60008301846109a9565b92915050565b6109dc816108d4565b82525050565b60006020820190506109f760008301846109d3565b92915050565b6000819050919050565b6000610a22610a1d610a1884610837565b6109fd565b610837565b9050919050565b6000610a3482610a07565b9050919050565b6000610a4682610a29565b9050919050565b610a5681610a3b565b82525050565b6000602082019050610a716000830184610a4d565b92915050565b610a8081610857565b8114610a8b57600080fd5b50565b600081519050610a9d81610a77565b92915050565b600060208284031215610ab957610ab8610832565b5b6000610ac784828501610a8e565b91505092915050565b600082825260208201905092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320756e70617573657200000000000000000000000000000000000000000000602082015250565b6000610b3d602a83610ad0565b9150610b4882610ae1565b604082019050919050565b60006020820190508181036000830152610b6c81610b30565b9050919050565b610b7c81610857565b82525050565b6000602082019050610b976000830184610b73565b92915050565b610ba68161099d565b8114610bb157600080fd5b50565b600081519050610bc381610b9d565b92915050565b600060208284031215610bdf57610bde610832565b5b6000610bed84828501610bb4565b91505092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320706175736572000000000000000000000000000000000000000000000000602082015250565b6000610c52602883610ad0565b9150610c5d82610bf6565b604082019050919050565b60006020820190508181036000830152610c8181610c45565b9050919050565b7f5061757361626c652e70617573653a20696e76616c696420617474656d70742060008201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000602082015250565b6000610ce4603883610ad0565b9150610cef82610c88565b604082019050919050565b60006020820190508181036000830152610d1381610cd7565b9050919050565b7f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060008201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000602082015250565b6000610d76603883610ad0565b9150610d8182610d1a565b604082019050919050565b60006020820190508181036000830152610da581610d69565b9050919050565b7f5061757361626c652e5f73657450617573657252656769737472793a206e657760008201527f50617573657252656769737472792063616e6e6f7420626520746865207a657260208201527f6f20616464726573730000000000000000000000000000000000000000000000604082015250565b6000610e2e604983610ad0565b9150610e3982610dac565b606082019050919050565b60006020820190508181036000830152610e5d81610e21565b9050919050565b6000604082019050610e796000830185610a4d565b610e866020830184610a4d565b939250505056fea2646970667358221220fd39cf86e6b9898a36eabe54f5c757a773f716b61627456f2d9670d882c8f64464736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b506107c2806100206000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635ac86ab71161005b5780635ac86ab7146100b25780635c975abb146100e6578063886f1195146100f7578063fabc1cbc1461012257600080fd5b806310d67a2f14610082578063136439dd14610097578063595c6a67146100aa575b600080fd5b61009561009036600461065b565b610135565b005b6100956100a536600461067f565b6101ef565b61009561032e565b6100d16100c0366004610698565b6001805460ff9092161b9081161490565b60405190151581526020015b60405180910390f35b6001546040519081526020016100dd565b60005461010a906001600160a01b031681565b6040516001600160a01b0390911681526020016100dd565b61009561013036600461067f565b6103f5565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101aa91906106bb565b6001600160a01b0316336001600160a01b0316146101e35760405162461bcd60e51b81526004016101da906106d8565b60405180910390fd5b6101ec8161054f565b50565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025b9190610722565b6102775760405162461bcd60e51b81526004016101da90610744565b600154818116146102f05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60005460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610376573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039a9190610722565b6103b65760405162461bcd60e51b81526004016101da90610744565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60008054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046a91906106bb565b6001600160a01b0316336001600160a01b03161461049a5760405162461bcd60e51b81526004016101da906106d8565b6001541981196001541916146105185760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016101da565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610323565b6001600160a01b0381166105dd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016101da565b600054604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146101ec57600080fd5b60006020828403121561066d57600080fd5b813561067881610646565b9392505050565b60006020828403121561069157600080fd5b5035919050565b6000602082840312156106aa57600080fd5b813560ff8116811461067857600080fd5b6000602082840312156106cd57600080fd5b815161067881610646565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561073457600080fd5b8151801515811461067857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea26469706673582212206ec8660c90f9020eac1acdb7cf9763b01b3517dc730fb33c9aceb4c71197896f64736f6c634300080c0033", } // PausableABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/PauserRegistry/binding.go b/pkg/bindings/PauserRegistry/binding.go index 3c963830b..121537674 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}]", - Bin: "0x60806040523480156200001157600080fd5b5060405162000fb738038062000fb78339818101604052810190620000379190620004ae565b60005b82518110156200008a57620000748382815181106200005e576200005d62000514565b5b60200260200101516001620000a460201b60201c565b808062000081906200057c565b9150506200003a565b506200009c81620001ac60201b60201c565b505062000793565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000117576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010e9062000651565b60405180910390fd5b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b91528282604051620001a0929190620006a1565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200021f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002169062000744565b60405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826040516200027492919062000766565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200032482620002d9565b810181811067ffffffffffffffff82111715620003465762000345620002ea565b5b80604052505050565b60006200035b620002c0565b905062000369828262000319565b919050565b600067ffffffffffffffff8211156200038c576200038b620002ea565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003cf82620003a2565b9050919050565b620003e181620003c2565b8114620003ed57600080fd5b50565b6000815190506200040181620003d6565b92915050565b60006200041e62000418846200036e565b6200034f565b905080838252602082019050602084028301858111156200044457620004436200039d565b5b835b818110156200047157806200045c8882620003f0565b84526020840193505060208101905062000446565b5050509392505050565b600082601f830112620004935762000492620002d4565b5b8151620004a584826020860162000407565b91505092915050565b60008060408385031215620004c857620004c7620002ca565b5b600083015167ffffffffffffffff811115620004e957620004e8620002cf565b5b620004f7858286016200047b565b92505060206200050a85828601620003f0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b6000620005898262000572565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620005bf57620005be62000543565b5b600182019050919050565b600082825260208201905092915050565b7f50617573657252656769737472792e5f7365745061757365723a207a65726f2060008201527f6164647265737320696e70757400000000000000000000000000000000000000602082015250565b600062000639602d83620005ca565b91506200064682620005db565b604082019050919050565b600060208201905081810360008301526200066c816200062a565b9050919050565b6200067e81620003c2565b82525050565b60008115159050919050565b6200069b8162000684565b82525050565b6000604082019050620006b8600083018562000673565b620006c7602083018462000690565b9392505050565b7f50617573657252656769737472792e5f736574556e7061757365723a207a657260008201527f6f206164647265737320696e7075740000000000000000000000000000000000602082015250565b60006200072c602f83620005ca565b91506200073982620006ce565b604082019050919050565b600060208201905081810360008301526200075f816200071d565b9050919050565b60006040820190506200077d600083018562000673565b6200078c602083018462000673565b9392505050565b61081480620007a36000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610081578063ce5484281461009d578063eab66d7a146100b9575b600080fd5b61006b600480360381019061006691906104cc565b6100d7565b6040516100789190610514565b60405180910390f35b61009b6004803603810190610096919061055b565b6100f7565b005b6100b760048036038101906100b291906104cc565b610195565b005b6100c1610231565b6040516100ce91906105aa565b60405180910390f35b60006020528060005260406000206000915054906101000a900460ff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017e90610648565b60405180910390fd5b6101918282610257565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021c90610648565b60405180910390fd5b61022e8161035a565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156102c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102be906106da565b60405180910390fd5b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152828260405161034e9291906106fa565b60405180910390a15050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156103ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c190610795565b60405180910390fd5b7f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260405161041d9291906107b5565b60405180910390a180600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006104998261046e565b9050919050565b6104a98161048e565b81146104b457600080fd5b50565b6000813590506104c6816104a0565b92915050565b6000602082840312156104e2576104e1610469565b5b60006104f0848285016104b7565b91505092915050565b60008115159050919050565b61050e816104f9565b82525050565b60006020820190506105296000830184610505565b92915050565b610538816104f9565b811461054357600080fd5b50565b6000813590506105558161052f565b92915050565b6000806040838503121561057257610571610469565b5b6000610580858286016104b7565b925050602061059185828601610546565b9150509250929050565b6105a48161048e565b82525050565b60006020820190506105bf600083018461059b565b92915050565b600082825260208201905092915050565b7f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160008201527f7320756e70617573657200000000000000000000000000000000000000000000602082015250565b6000610632602a836105c5565b915061063d826105d6565b604082019050919050565b6000602082019050818103600083015261066181610625565b9050919050565b7f50617573657252656769737472792e5f7365745061757365723a207a65726f2060008201527f6164647265737320696e70757400000000000000000000000000000000000000602082015250565b60006106c4602d836105c5565b91506106cf82610668565b604082019050919050565b600060208201905081810360008301526106f3816106b7565b9050919050565b600060408201905061070f600083018561059b565b61071c6020830184610505565b9392505050565b7f50617573657252656769737472792e5f736574556e7061757365723a207a657260008201527f6f206164647265737320696e7075740000000000000000000000000000000000602082015250565b600061077f602f836105c5565b915061078a82610723565b604082019050919050565b600060208201905081810360008301526107ae81610772565b9050919050565b60006040820190506107ca600083018561059b565b6107d7602083018461059b565b939250505056fea2646970667358221220dee6ed19db09bc37305aba952b65a49b4592b68c389c789ca9ab8cea5043277c64736f6c634300080c0033", + Bin: "0x608060405234801561001057600080fd5b5060405161077838038061077883398101604081905261002f91610263565b60005b82518110156100775761006583828151811061005057610050610339565b6020026020010151600161008860201b60201c565b8061006f8161034f565b915050610032565b506100818161015a565b5050610378565b6001600160a01b0382166100f95760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b60648201526084015b60405180910390fd5b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b0381166101c85760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b60648201526084016100f0565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b038116811461025e57600080fd5b919050565b6000806040838503121561027657600080fd5b82516001600160401b038082111561028d57600080fd5b818501915085601f8301126102a157600080fd5b81516020828211156102b5576102b5610231565b8160051b604051601f19603f830116810181811086821117156102da576102da610231565b6040529283528183019350848101820192898411156102f857600080fd5b948201945b8386101561031d5761030e86610247565b855294820194938201936102fd565b965061032c9050878201610247565b9450505050509250929050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561037157634e487b7160e01b600052601160045260246000fd5b5060010190565b6103f1806103876000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212209d16b337e572efd6aa7c9a1f129223998361e2c66fd3f3315454d1a0590f6f0e64736f6c634300080c0033", } // PauserRegistryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StructuredLinkedList/binding.go b/pkg/bindings/StructuredLinkedList/binding.go index fce8e2a1b..b291ef98d 100644 --- a/pkg/bindings/StructuredLinkedList/binding.go +++ b/pkg/bindings/StructuredLinkedList/binding.go @@ -32,7 +32,7 @@ var ( // StructuredLinkedListMetaData contains all meta data concerning the StructuredLinkedList contract. var StructuredLinkedListMetaData = &bind.MetaData{ ABI: "[]", - Bin: "0x60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212203f4bd551859e3b28b35aafb07ba9fb58f0306ef37f8e64e99104da2a585c7c4a64736f6c634300080c0033", + Bin: "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212200b0f3aa07997f25ddb2b0dd17a1b6104304d811d2cec7f2d2dfcae3e3d618f6964736f6c634300080c0033", } // StructuredLinkedListABI is the input ABI used to generate the binding from. From b333d9b64f46c3f0a8b80e8e26427461faeb52ab Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 24 Jun 2024 15:55:51 +0000 Subject: [PATCH 30/85] test: finish verify start complete flow for pepe integration tests * chore: fix bindings --- src/test/integration/IntegrationBase.t.sol | 23 ++-- src/test/integration/IntegrationChecks.t.sol | 14 +- .../VerifyWC_StartCP_CompleteCP.t.sol | 129 ++++++++++++++++-- 3 files changed, 143 insertions(+), 23 deletions(-) diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 3b1abbaac..96a656b35 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -448,14 +448,7 @@ abstract contract IntegrationBase is IntegrationDeployer { strategies[0] = strat; addedShares[0] = _addedShares; - uint[] memory curShares = _getStakerShares(staker, strategies); - // Use timewarp to get previous staker shares - uint[] memory prevShares = _getPrevStakerShares(staker, strategies); - - // For each strategy, check (prev + added == cur) - for (uint i = 0; i < strategies.length; i++) { - assertApproxEqAbs(prevShares[i] + addedShares[i], curShares[i], 1, err); - } + assert_Snap_Added_StakerShares(staker, strategies, addedShares, err); } /// @dev Check that the staker has `removedShares` fewer delegatable shares @@ -476,6 +469,20 @@ abstract contract IntegrationBase is IntegrationDeployer { } } + function assert_Snap_Removed_StakerShares( + User staker, + IStrategy strat, + uint _removedShares, + string memory err + ) internal { + IStrategy[] memory strategies = new IStrategy[](1); + uint[] memory removedShares = new uint[](1); + strategies[0] = strat; + removedShares[0] = _removedShares; + + assert_Snap_Removed_StakerShares(staker, strategies, removedShares, err); + } + /// @dev Check that the staker's delegatable shares in ALL strategies have not changed /// since the last snapshot function assert_Snap_Unchanged_StakerShares( diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 667a953ce..b5beec9a0 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -72,6 +72,18 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Added_WithdrawableGwei(staker, expectedPodBalanceGwei, "should have added expected gwei to withdrawable restaked exec layer gwei"); } + function check_CompleteCheckpoint_WithSlashing_State( + User staker, + uint40[] memory slashedValidators, + uint64 slashedAmountGwei + ) internal { + check_CompleteCheckpoint_State(staker); + + assert_Snap_Removed_StakerShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have reduced 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"); + } + function check_CompleteCheckpoint_WithExits_State( User staker, uint40[] memory exitedValidators, @@ -79,7 +91,7 @@ contract IntegrationCheckUtils is IntegrationBase { ) internal { check_CompleteCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei); - // TODO check share delta + assert_Snap_Unchanged_StakerShares(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"); 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 e26278921..556fdd842 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -132,6 +132,30 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { staker.startCheckpoint(); } + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + + cheats.expectRevert("EigenPod._startCheckpoint: cannot checkpoint twice in one block"); + staker.startCheckpoint(); + } + /// 1. Verify validators' withdrawal credentials /// -- move forward 1 or more epochs /// 2. start a checkpoint @@ -230,6 +254,10 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// -- fully exit validators to pod /// 3. complete a checkpoint /// => no change in shares between 1 and 3 + /// -- move forward an epoch + /// 4. start a checkpoint + /// 5. complete a checkpoint + /// => exited balance should be reflected in 4 and 5 function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); @@ -244,11 +272,17 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { // Fully exit one or more validators and advance epoch without generating rewards uint40[] memory subset = _choose(validators); - staker.exitValidators(subset); + uint64 exitedBalanceGwei = staker.exitValidators(subset); beaconChain.advanceEpoch_NoRewards(); staker.completeCheckpoint(); check_CompleteCheckpoint_State(staker); + + staker.startCheckpoint(); + check_StartCheckpoint_WithPodBalance_State(staker, exitedBalanceGwei); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithExits_State(staker, subset, exitedBalanceGwei); } /******************************************************************************* @@ -256,7 +290,82 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { (SLASH TO POD VARIANTS) *******************************************************************************/ - // TODO + /// -- 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + beaconChain.slashValidators(validators); + // Advance epoch, withdrawing slashed validators to pod + beaconChain.advanceEpoch_NoRewards(); + + cheats.expectRevert("EigenPod._verifyWithdrawalCredentials: validator must not be exiting"); + staker.verifyWithdrawalCredentials(validators); + } + + /// 1. Verify validators' withdrawal credentials + /// -- get slashed on beacon chain; exit to pod + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch without generating rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + uint64 slashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.startCheckpoint(); + check_StartCheckpoint_WithPodBalance_State(staker, beaconBalanceGwei - slashedBalanceGwei); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithSlashing_State(staker, validators, slashedBalanceGwei); + } + + + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- get slashed on beacon chain; exit to pod + /// 3. complete a checkpoint + /// => no change in shares between 1 and 3 + /// -- move forward an epoch + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch without generating rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + uint64 slashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + + staker.startCheckpoint(); + check_StartCheckpoint_WithPodBalance_State(staker, beaconBalanceGwei - slashedBalanceGwei); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithSlashing_State(staker, validators, slashedBalanceGwei); + } + /******************************************************************************* VERIFY -> START -> COMPLETE CHECKPOINT @@ -412,11 +521,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { uint64 expectedWithdrawnGwei = uint64(validators.length) * beaconChain.CONSENSUS_REWARD_AMOUNT_GWEI(); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); - // check that `completeCheckpoint` added nothing to `withdrawableRestakedExecutionLayerGwei` - assert_Snap_Added_WithdrawableGwei(staker, 0, "withdrawable restaked gwei should not have increased"); // `pod.balance == gweiSent + remainderSent assert_PodBalance_Eq(staker, (expectedWithdrawnGwei * GWEI_TO_WEI), "pod balance should equal expected"); + check_CompleteCheckpoint_WithPodBalance_State(staker, 0); } /******************************************************************************* @@ -446,11 +553,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { check_StartCheckpoint_WithPodBalance_State(staker, gweiSent); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); - // check that `completeCheckpoint` added `gweiSent` to `withdrawableRestakedExecutionLayerGwei` - assert_Snap_Added_WithdrawableGwei(staker, gweiSent, "withdrawable restaked gwei should have increased by expected"); // check that `pod.balance == withdrawableRestakedExecutionLayerGwei + remainderSent assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); + check_CompleteCheckpoint_WithPodBalance_State(staker, gweiSent); } /// 1. Verify validators' withdrawal credentials @@ -475,11 +580,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { check_StartCheckpoint_WithPodBalance_State(staker, gweiSent); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); - // check that `completeCheckpoint` added `gweiSent` to `withdrawableRestakedExecutionLayerGwei` - assert_Snap_Added_WithdrawableGwei(staker, gweiSent, "withdrawable restaked gwei should have increased by expected"); // check that `pod.balance == withdrawableRestakedExecutionLayerGwei + remainderSent assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); + check_CompleteCheckpoint_WithPodBalance_State(staker, gweiSent); } /// 1. Verify validators' withdrawal credentials @@ -505,10 +608,8 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); staker.completeCheckpoint(); - check_CompleteCheckpoint_State(staker); - // check that `completeCheckpoint` added nothing to `withdrawableRestakedExecutionLayerGwei` - assert_Snap_Added_WithdrawableGwei(staker, 0, "withdrawable restaked gwei should not have increased"); // `pod.balance == gweiSent + remainderSent assert_PodBalance_Eq(staker, (gweiSent * GWEI_TO_WEI) + remainderSent, "pod balance should equal expected"); + check_CompleteCheckpoint_WithPodBalance_State(staker, 0); } } \ No newline at end of file From eb6eef27eb059d3e89c43600d942e751c90402f5 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Mon, 24 Jun 2024 18:55:08 +0000 Subject: [PATCH 31/85] test: add slashing and native eth integration tests --- src/test/integration/IntegrationBase.t.sol | 20 +++ src/test/integration/IntegrationChecks.t.sol | 22 +++- .../integration/mocks/BeaconChainMock.t.sol | 19 ++- .../VerifyWC_StartCP_CompleteCP.t.sol | 117 +++++++++++++++++- src/test/integration/users/User.t.sol | 14 +++ 5 files changed, 183 insertions(+), 9 deletions(-) diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 96a656b35..18e88bede 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -677,6 +677,16 @@ abstract contract IntegrationBase is IntegrationDeployer { assertEq(curActiveValidatorCount + exitedValidators, prevActiveValidatorCount, err); } + function assert_Snap_Unchanged_ActiveValidatorCount( + User staker, + string memory err + ) internal { + uint curActiveValidatorCount = _getActiveValidatorCount(staker); + uint prevActiveValidatorCount = _getPrevActiveValidatorCount(staker); + + assertEq(curActiveValidatorCount, prevActiveValidatorCount, err); + } + function assert_Snap_Added_ActiveValidators( User staker, uint40[] memory addedValidators, @@ -731,6 +741,16 @@ abstract contract IntegrationBase is IntegrationDeployer { assertTrue(prevCheckpointTimestamp != 0, err); } + function assert_Snap_Unchanged_Checkpoint( + User staker, + string memory err + ) internal { + uint64 curCheckpointTimestamp = _getCheckpointTimestamp(staker); + uint64 prevCheckpointTimestamp = _getPrevCheckpointTimestamp(staker); + + assertEq(curCheckpointTimestamp, prevCheckpointTimestamp, err); + } + function assert_Snap_Updated_LastCheckpoint( User staker, string memory err diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index b5beec9a0..2fc360581 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -39,10 +39,16 @@ contract IntegrationCheckUtils is IntegrationBase { assert_CheckpointPodBalance(staker, expectedPodBalanceGwei, "checkpoint podBalanceGwei should equal expected"); } - function check_EmptyCheckpoint_State( - User staker + function check_StartCheckpoint_NoValidators_State( + User staker, + uint64 sharesAddedGwei ) internal { - revert("TODO"); + assert_Snap_Added_StakerShares(staker, BEACONCHAIN_ETH_STRAT, sharesAddedGwei * GWEI_TO_WEI, "should have added staker shares"); + assert_Snap_Added_WithdrawableGwei(staker, sharesAddedGwei, "should have added to withdrawable restaked gwei"); + + assert_Snap_Unchanged_ActiveValidatorCount(staker, "active validator count should remain 0"); + assert_Snap_Updated_LastCheckpoint(staker, "last checkpoint timestamp should have increased"); + assert_Snap_Unchanged_Checkpoint(staker, "current checkpoint timestamp should be unchanged"); } function check_CompleteCheckpoint_State( @@ -84,6 +90,16 @@ contract IntegrationCheckUtils is IntegrationBase { assert_Snap_Removed_ActiveValidators(staker, slashedValidators, "exited validators should each be WITHDRAWN"); } + function check_CompleteCheckpoint_WithCLSlashing_State( + User staker, + uint64 slashedAmountGwei + ) internal { + check_CompleteCheckpoint_State(staker); + + assert_Snap_Removed_StakerShares(staker, BEACONCHAIN_ETH_STRAT, slashedAmountGwei * GWEI_TO_WEI, "should have reduced shares by slashed amount"); + assert_Snap_Unchanged_ActiveValidatorCount(staker, "should not have changed active validator count"); + } + function check_CompleteCheckpoint_WithExits_State( User staker, uint40[] memory exitedValidators, diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 889da8ec0..74b3c6641 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -216,11 +216,12 @@ contract BeaconChainMock is PrintUtils { uint40 validatorIndex = _validators[i]; Validator storage v = validators[validatorIndex]; require(!v.isDummy, "BeaconChainMock: attempting to exit dummy validator. We need those for proofgen >:("); - require(!v.isSlashed, "BeaconChainMock: validator already slashed"); // Mark slashed and initiate validator exit - v.isSlashed = true; - v.exitEpoch = currentEpoch() + 1; + if (!v.isSlashed) { + v.isSlashed = true; + v.exitEpoch = currentEpoch() + 1; + } // Calculate slash amount uint64 curBalanceGwei = _currentBalanceGwei(validatorIndex); @@ -381,8 +382,16 @@ contract BeaconChainMock is PrintUtils { _log("- building beacon state trees"); // Log total number of validators and number being processed for the first time - lastIndexProcessed = validators.length - 1; - + if (validators.length > 0) { + lastIndexProcessed = validators.length - 1; + } else { + // generate an empty root if we don't have any validators + EIP_4788_ORACLE.setBlockRoot(curTimestamp, keccak256("")); + + _log("-- no validators; added empty block root"); + return; + } + // Build merkle tree for validators bytes32 validatorsRoot = _buildMerkleTree({ leaves: _getValidatorLeaves(), 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 556fdd842..c569974bd 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -365,7 +365,106 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { staker.completeCheckpoint(); check_CompleteCheckpoint_WithSlashing_State(staker, validators, slashedBalanceGwei); } - + + /******************************************************************************* + VERIFY -> PROVE STALE BALANCE -> COMPLETE CHECKPOINT + *******************************************************************************/ + + /// 1. Verify validators' withdrawal credentials + /// -- get slashed on beacon chain; exit to pod + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch without generating rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + uint64 slashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyStaleBalance(validators[0]); + check_StartCheckpoint_WithPodBalance_State(staker, beaconBalanceGwei - slashedBalanceGwei); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithSlashing_State(staker, validators, slashedBalanceGwei); + } + + /// 1. Verify validators' withdrawal credentials + /// -- get slashed on beacon chain; do not exit to pod + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch without generating rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + // Slash validators but do not process exits to pod + uint64 slashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoWithdraw(); + + staker.verifyStaleBalance(validators[0]); + check_StartCheckpoint_WithPodBalance_State(staker, 0); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithCLSlashing_State(staker, slashedBalanceGwei); + + // Slash validators again but do not process exits to pod + uint64 secondSlashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoWithdraw(); + + staker.verifyStaleBalance(validators[0]); + check_StartCheckpoint_WithPodBalance_State(staker, 0); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithCLSlashing_State(staker, secondSlashedBalanceGwei); + } + + /// 1. Verify validators' withdrawal credentials + /// 2. start a checkpoint + /// -- get slashed on beacon chain; exit to pod + /// 3. complete a checkpoint + /// => no change in shares between 1 and 3 + /// -- move forward an epoch + /// 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) { + (User staker, ,) = _newRandomStaker(); + + (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + // Advance epoch without generating rewards + beaconChain.advanceEpoch_NoRewards(); + + staker.verifyWithdrawalCredentials(validators); + check_VerifyWC_State(staker, validators, beaconBalanceGwei); + + staker.startCheckpoint(); + check_StartCheckpoint_State(staker); + + uint64 slashedBalanceGwei = beaconChain.slashValidators(validators); + beaconChain.advanceEpoch_NoRewards(); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_State(staker); + + staker.verifyStaleBalance(validators[0]); + check_StartCheckpoint_WithPodBalance_State(staker, beaconBalanceGwei - slashedBalanceGwei); + + staker.completeCheckpoint(); + check_CompleteCheckpoint_WithSlashing_State(staker, validators, slashedBalanceGwei); + } /******************************************************************************* VERIFY -> START -> COMPLETE CHECKPOINT @@ -531,6 +630,22 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { (NATIVE ETH VARIANTS) *******************************************************************************/ + /// -- Pod receives native ETH via fallback + /// 1. start a checkpoint + /// => checkpoint should auto-complete, awarding shares for ETH in pod + function test_NativeETH_StartCP(uint24 _rand) public r(_rand) { + (User staker, ,) = _newRandomStaker(); + // Send a random amount of ETH to staker's fallback + (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); + + // Move forward an epoch so we generate a state root that can be queried in startCheckpoint + beaconChain.advanceEpoch(); + + // should behave identically to partial withdrawals captured by the "earn to pod" variants + staker.startCheckpoint(); + check_StartCheckpoint_NoValidators_State(staker, gweiSent); + } + /// -- Pod receives native ETH via fallback /// 1. Verify validators' withdrawal credentials /// 2. start a checkpoint diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 203d3a9ad..5ab045151 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -243,6 +243,20 @@ contract User is PrintUtils { _completeCheckpoint(); } + function verifyStaleBalance(uint40 validatorIndex) public createSnapshot virtual { + _logM("verifyStaleBalance"); + + StaleBalanceProofs memory proof = beaconChain.getStaleBalanceProofs(validatorIndex); + + try pod.verifyStaleBalance({ + beaconTimestamp: proof.beaconTimestamp, + stateRootProof: proof.stateRootProof, + proof: proof.validatorProof + }) { } catch (bytes memory err) { + _revert(err); + } + } + /******************************************************************************* STRATEGY METHODS *******************************************************************************/ From a190a01a992975bcf14e83ba4f3455188d1ff729 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:40:20 -0400 Subject: [PATCH 32/85] build: partial withdrawal batching upgrade scripts (#598) * build: preprod pod upgrade scripts * chore: cleanup unused files --- ....json => eigenlayer_addresses.config.json} | 29 ++++---- .../eigenlayer_addresses_preprod.config.json | 48 +++++++++++++ .../holesky/eigenlayer_preprod.config.json | 56 +++++++++++++++ .../EigenPod_Checkpoint_Deploy_Preprod.s.sol | 69 +++++++++++++++++++ script/utils/ExistingDeploymentParser.sol | 6 -- 5 files changed, 189 insertions(+), 19 deletions(-) rename script/configs/holesky/{Holesky_current_deployment.config.json => eigenlayer_addresses.config.json} (81%) create mode 100644 script/configs/holesky/eigenlayer_addresses_preprod.config.json create mode 100644 script/configs/holesky/eigenlayer_preprod.config.json create mode 100644 script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol diff --git a/script/configs/holesky/Holesky_current_deployment.config.json b/script/configs/holesky/eigenlayer_addresses.config.json similarity index 81% rename from script/configs/holesky/Holesky_current_deployment.config.json rename to script/configs/holesky/eigenlayer_addresses.config.json index 27734d524..b37e8ce5b 100644 --- a/script/configs/holesky/Holesky_current_deployment.config.json +++ b/script/configs/holesky/eigenlayer_addresses.config.json @@ -15,33 +15,37 @@ "eigenPodManager": "0x30770d7E3e71112d7A6b7259542D1f680a70e315", "eigenPodManagerImplementation": "0x5265C162f7d5F3fE3175a78828ab16bf5E324a7B", "emptyContract": "0x9690d52B1Ce155DB2ec5eCbF5a262ccCc7B3A6D2", - "rewardsCoordinator": "0x0000000000000000000000000000000000000000", - "rewardsCoordinatorImplementation": "0x0000000000000000000000000000000000000000", "slasher": "0xcAe751b75833ef09627549868A04E32679386e7C", "slasherImplementation": "0x99715D255E34a39bE9943b82F281CA734bcF345A", - "numStrategiesDeployed": 8, + "numStrategiesDeployed": 10, "strategies": { "WETH": "0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9", "rETH": "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0", "stETH": "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3", - "lsETH": "0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943", - "frxETH": "0x15F70a41Afe34020B3B16079010D3e88c4A85daf", "ETHx": "0x31B6F59e1627cEfC9fA174aD03859fC337666af7", + "cbETH": "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6", + "sfrxETH": "0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c", + "lsETH": "0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943", "osETH": "0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef", - "cbETH": "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6" + "mETH": "0xaccc5A86732BE85b5012e8614AF237801636F8e5", + "ankrETH" :"0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac" }, "strategyAddresses": [ - "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0", "0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9", + "0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0", "0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3", - "0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943", - "0x15F70a41Afe34020B3B16079010D3e88c4A85daf", "0x31B6F59e1627cEfC9fA174aD03859fC337666af7", + "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6", + "0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c", + "0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943", "0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef", - "0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6" + "0xaccc5A86732BE85b5012e8614AF237801636F8e5", + "0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac" ], "strategyManager": "0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6", "strategyManagerImplementation": "0x59f766A603C53f3AC8Be43bBe158c1519b193a18", + "rewardsCoordinator": "0xAcc1fb458a1317E886dB376Fc8141540537E68fE", + "rewardsCoordinatorImplementation": "0x123C1A3543DBCA3f704E703dDda7FAAaA8e43D02", "token": { "tokenProxyAdmin": "0x67482666771e82C9a73BB9e9A22B2B597f448BBf", "EIGEN": "0x3B78576F7D6837500bA3De27A60c7f594934027E", @@ -52,10 +56,9 @@ "eigenStrategyImpl": "0x94650e09a471CEF96e7966cabf26718FBf352697" } }, - "numStrategies": 8, "chainInfo": { "chainId": 17000, - "deploymentBlock": 1167041 + "deploymentBlock": 1195642 }, "parameters": { "communityMultisig": "0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7", @@ -64,5 +67,5 @@ "pauserMultisig": "0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7", "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D" } - } + \ No newline at end of file diff --git a/script/configs/holesky/eigenlayer_addresses_preprod.config.json b/script/configs/holesky/eigenlayer_addresses_preprod.config.json new file mode 100644 index 000000000..b37792862 --- /dev/null +++ b/script/configs/holesky/eigenlayer_addresses_preprod.config.json @@ -0,0 +1,48 @@ +{ + "addresses": { + "avsDirectory": "0x141d6995556135D4997b2ff72EB443Be300353bC", + "avsDirectoryImplementation": "0x357978adC03375BD6a3605DE055fABb84695d79A", + "baseStrategyImplementation": "0x62450517EfA1CE60d79801daf8f95973865e8D40", + "beaconOracle": "0x4C116BB629bff7A8373c2378bBd919f8349B8f25", + "delayedWithdrawalRouter": "0xC4BC46a87A67a531eCF7f74338E1FA79533334Fa", + "delayedWithdrawalRouterImplementation": "0x0011FA2c512063C495f77296Af8d195F33A8Dd38", + "delegationManager": "0x75dfE5B44C2E530568001400D3f704bC8AE350CC", + "delegationManagerImplementation": "0x56E88cb4f0136fC27D95499dE4BE2acf47946Fa1", + "eigenLayerPauserReg": "0x9Ab2FEAf0465f0eD51Fc2b663eF228B418c9Dad1", + "eigenLayerProxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B", + "eigenPodBeacon": "0x92Cc4a800A1513E85C481dDDf3A06C6921211eaC", + "eigenPodImplementation": "0x2D6c7f9862BD80Cf0d9d93FC6b513D69E7Db7869", + "eigenPodManager": "0xB8d8952f572e67B11e43bC21250967772fa883Ff", + "eigenPodManagerImplementation": "0xc5B857A92245f64e9D90cCc5b096Db82eB77eB5c", + "emptyContract": "0x9690d52B1Ce155DB2ec5eCbF5a262ccCc7B3A6D2", + "rewardsCoordinator": "0xb22Ef643e1E067c994019A4C19e403253C05c2B0", + "rewardsCoordinatorImplementation": "0x7C80B0d3aFBeF9Bbd03Aab72cD2d90a12c11D394", + "slasher": "0x12699471dF8dca329C76D72823B1b79d55709384", + "slasherImplementation": "0x9460fCe11E1e0365419fa860599903B4E5097cf0", + "numStrategiesDeployed": 0, + "strategies": {}, + "strategyAddresses": [], + "strategyManager": "0xF9fbF2e35D8803273E214c99BF15174139f4E67a", + "strategyManagerImplementation": "0x1a26B23a004C512350d7Dd89056655A80b850199", + "token": { + "EIGEN": "0xD58f6844f79eB1fbd9f7091d05f7cb30d3363926", + "EIGENImpl": "0x95a7431400F362F3647a69535C5666cA0133CAA0", + "bEIGEN": "0xA72942289a043874249E60469F68f08B8c6ECCe8", + "bEIGENImpl": "0xd5FdabDac3d8ACeAB7BFfDDFA18877A4c5D5Aa82", + "eigenStrategy": "0xdcCF401fD121d8C542E96BC1d0078884422aFAD2", + "eigenStrategyImpl": "0x59D13E7Fb0bC0e57c1fc6594ff701592A6e4dD2B", + "tokenProxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B" + } + }, + "chainInfo": { + "chainId": 17000, + "deploymentBlock": 1477016 + }, + "parameters": { + "communityMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "executorMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "operationsMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "pauserMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D" + } +} \ No newline at end of file diff --git a/script/configs/holesky/eigenlayer_preprod.config.json b/script/configs/holesky/eigenlayer_preprod.config.json new file mode 100644 index 000000000..7552f49f4 --- /dev/null +++ b/script/configs/holesky/eigenlayer_preprod.config.json @@ -0,0 +1,56 @@ +{ + "chainInfo": { + "chainId": 17000 + }, + "multisig_addresses": { + "pauserMultisig": "0x53410249ec7d3a3F9F1ba3912D50D6A3Df6d10A7", + "communityMultisig": "0xCb8d2f9e55Bc7B1FA9d089f9aC80C583D2BDD5F7", + "operationsMultisig": "0xfaEF7338b7490b9E272d80A1a39f4657cAf2b97d", + "executorMultisig": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348", + "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D" + }, + "strategies": { + "numStrategies": 0, + "MAX_PER_DEPOSIT": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "MAX_TOTAL_DEPOSITS": 115792089237316195423570985008687907853269984665640564039457584007913129639935, + "strategiesToDeploy": [] + }, + "strategyManager": { + "init_strategy_whitelister": "0x28Ade60640fdBDb2609D8d8734D1b5cBeFc0C348", + "init_paused_status": 0 + }, + "delegationManager": { + "init_paused_status": 0, + "init_minWithdrawalDelayBlocks": 10 + }, + "rewardsCoordinator": { + "init_paused_status": 0, + "CALCULATION_INTERVAL_SECONDS": 604800, + "MAX_REWARDS_DURATION": 6048000, + "MAX_RETROACTIVE_LENGTH": 7776000, + "MAX_FUTURE_LENGTH": 2592000, + "GENESIS_REWARDS_TIMESTAMP": 1710979200, + "rewards_updater_address": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4", + "activation_delay": 120, + "calculation_interval_seconds": 604800, + "global_operator_commission_bips": 1000 + }, + "avsDirectory": { + "init_paused_status": 0 + }, + "slasher": { + "init_paused_status": 0 + }, + "eigenPod": { + "MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR": 32000000000, + "GENESIS_TIME": 1695902400 + }, + "eigenPodManager": { + "init_paused_status": 0 + }, + "delayedWithdrawalRouter": { + "init_paused_status": 0, + "init_withdrawalDelayBlocks": 10 + }, + "ethPOSDepositAddress": "0x4242424242424242424242424242424242424242" +} \ No newline at end of file diff --git a/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol b/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol new file mode 100644 index 000000000..130812492 --- /dev/null +++ b/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol @@ -0,0 +1,69 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../../utils/ExistingDeploymentParser.sol"; + +/** + * @notice Script used for upgrading EigenPod and EPM Implementation for Holesky preprod + * anvil --fork-url $RPC_HOLESKY + * forge script script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv + * forge script script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol --rpc-url $RPC_HOLESKY --private-key $PRIVATE_KEY --verify --broadcast -vvvv + */ +contract EigenPod_Checkpoint_Deploy_Preprod is ExistingDeploymentParser { + + address testAddress = 0xDA29BB71669f46F2a779b4b62f03644A84eE3479; + address initOwner = 0xDA29BB71669f46F2a779b4b62f03644A84eE3479; + + function run() external virtual { + _parseInitialDeploymentParams( + "script/configs/holesky/eigenlayer_preprod.config.json" + ); + _parseDeployedContracts( + "script/configs/holesky/eigenlayer_addresses_preprod.config.json" + ); + + // START RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.startBroadcast(); + + emit log_named_address("Deployer Address", msg.sender); + + _upgradeEigenPodAndEPM(); + + // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.stopBroadcast(); + + // Sanity Checks + _verifyContractPointers(); + _verifyImplementations(); + _verifyContractsInitialized({isInitialDeployment: true}); + _verifyInitializationParams(); + + logAndOutputContractAddresses("script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json"); + } + + /** + * @notice Deploy EigenPod and EPM Implementation for Holesky preprod and upgrade the beacon/proxy + */ + function _upgradeEigenPodAndEPM() internal { + // Deploy implementations + eigenPodManagerImplementation = new EigenPodManager( + IETHPOSDeposit(ETHPOSDepositAddress), + eigenPodBeacon, + strategyManager, + slasher, + delegationManager + ); + eigenPodImplementation = new EigenPod( + IETHPOSDeposit(ETHPOSDepositAddress), + eigenPodManager, + EIGENPOD_GENESIS_TIME + ); + + // upgrade TUPS and UpgradeableBeacon + eigenLayerProxyAdmin.upgrade( + TransparentUpgradeableProxy(payable(address(eigenPodManager))), + address(eigenPodManagerImplementation) + ); + eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); + } +} diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 7c4a83e04..8498da43e 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -114,7 +114,6 @@ contract ExistingDeploymentParser is Script, Test { uint32 REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS; // EigenPodManager uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; - uint64 EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP; // EigenPod uint64 EIGENPOD_GENESIS_TIME; uint64 EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR; @@ -316,10 +315,6 @@ contract ExistingDeploymentParser is Script, Test { initialDeploymentData, ".eigenPodManager.init_paused_status" ); - EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP = uint64( - stdJson.readUint(initialDeploymentData, ".eigenPodManager.deneb_fork_timestamp") - ); - // EigenPod EIGENPOD_GENESIS_TIME = uint64(stdJson.readUint(initialDeploymentData, ".eigenPod.GENESIS_TIME")); EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR = uint64( @@ -652,7 +647,6 @@ contract ExistingDeploymentParser is Script, Test { emit log_named_uint("REWARDS_COORDINATOR_INIT_PAUSED_STATUS", REWARDS_COORDINATOR_INIT_PAUSED_STATUS); // todo log all rewards coordinator params emit log_named_uint("EIGENPOD_MANAGER_INIT_PAUSED_STATUS", EIGENPOD_MANAGER_INIT_PAUSED_STATUS); - emit log_named_uint("EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP", EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP); emit log_named_uint("EIGENPOD_GENESIS_TIME", EIGENPOD_GENESIS_TIME); emit log_named_uint( "EIGENPOD_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR", From 64b0d0a23292b051f22f5e9a0d641b7c2c71dfb4 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 25 Jun 2024 14:49:03 +0000 Subject: [PATCH 33/85] chore: add pepe deployment output --- ...nPod_Checkpoint_Deploy_Preprod.output.json | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json diff --git a/script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json b/script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json new file mode 100644 index 000000000..a43d651b2 --- /dev/null +++ b/script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json @@ -0,0 +1,34 @@ +{ + "addresses": { + "avsDirectory": "0x141d6995556135D4997b2ff72EB443Be300353bC", + "avsDirectoryImplementation": "0x357978adC03375BD6a3605DE055fABb84695d79A", + "baseStrategyImplementation": "0x62450517EfA1CE60d79801daf8f95973865e8D40", + "delegationManager": "0x75dfE5B44C2E530568001400D3f704bC8AE350CC", + "delegationManagerImplementation": "0x56E88cb4f0136fC27D95499dE4BE2acf47946Fa1", + "eigenLayerPauserReg": "0x9Ab2FEAf0465f0eD51Fc2b663eF228B418c9Dad1", + "eigenLayerProxyAdmin": "0x1BEF05C7303d44e0E2FCD2A19d993eDEd4c51b5B", + "eigenPodBeacon": "0x92Cc4a800A1513E85C481dDDf3A06C6921211eaC", + "eigenPodImplementation": "0x537A9Ce71928C9377823ef72C7F898b8d092f520", + "eigenPodManager": "0xB8d8952f572e67B11e43bC21250967772fa883Ff", + "eigenPodManagerImplementation": "0x378C459ea6F026D8BF045404d2f3e3451682c6a2", + "emptyContract": "0x9690d52B1Ce155DB2ec5eCbF5a262ccCc7B3A6D2", + "rewardsCoordinator": "0xb22Ef643e1E067c994019A4C19e403253C05c2B0", + "rewardsCoordinatorImplementation": "0x7C80B0d3aFBeF9Bbd03Aab72cD2d90a12c11D394", + "slasher": "0x12699471dF8dca329C76D72823B1b79d55709384", + "slasherImplementation": "0x9460fCe11E1e0365419fa860599903B4E5097cf0", + "strategies": "", + "strategyManager": "0xF9fbF2e35D8803273E214c99BF15174139f4E67a", + "strategyManagerImplementation": "0x1a26B23a004C512350d7Dd89056655A80b850199" + }, + "chainInfo": { + "chainId": 17000, + "deploymentBlock": 1805992 + }, + "parameters": { + "communityMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "executorMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "operationsMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "pauserMultisig": "0xDA29BB71669f46F2a779b4b62f03644A84eE3479", + "timelock": "0xcF19CE0561052a7A7Ff21156730285997B350A7D" + } +} \ No newline at end of file From 4bfc599a93d81833972704a931884b0bb30f9b81 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Tue, 25 Jun 2024 19:57:02 +0000 Subject: [PATCH 34/85] docs: finish main eigenpod docs and improve commenting * docs: finish main eigenpod docs --- docs/README.md | 18 ++--- docs/core/EigenPod.md | 94 ++++++++++++++++++++++---- docs/core/EigenPodManager.md | 4 +- src/contracts/interfaces/IEigenPod.sol | 9 +-- src/contracts/pods/EigenPod.sol | 30 +++++++- src/contracts/pods/EigenPodStorage.sol | 14 ++-- 6 files changed, 125 insertions(+), 44 deletions(-) diff --git a/docs/README.md b/docs/README.md index 604ffd581..e5bfdcb7f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ [middleware-repo]: https://github.com/Layr-Labs/eigenlayer-middleware/ -## EigenLayer M2 Docs +## EigenLayer Docs - v0.4.0 Release This repo contains the EigenLayer core contracts, which enable restaking of liquid staking tokens (LSTs) and beacon chain ETH to secure new services, called AVSs (actively validated services). For more info on AVSs, check out the EigenLayer middleware contracts [here][middleware-repo]. @@ -33,16 +33,14 @@ This document provides an overview of system components, contracts, and user rol | -------- | -------- | -------- | | [`EigenPodManager.sol`](../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy | | [`EigenPod.sol`](../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | -| [`DelayedWithdrawalRouter.sol`](../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy | -| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS proxy | [`0x40B1...9f2c`](https://goerli.etherscan.io/address/0x40B10ddD29a2cfF33DBC420AE5bbDa0649049f2c) | These contracts work together to enable native ETH restaking: -* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials, balance, and exit. An `EigenPod's` main role is to serve as the withdrawal address for one or more of a user's validators. +* Users deploy `EigenPods` via the `EigenPodManager`, which contain beacon chain state proof logic used to verify a validator's withdrawal credentials and current balances. An `EigenPod's` main role is to serve as the fee recipient and/or withdrawal credentials for one or more of a user's validators. * The `EigenPodManager` handles `EigenPod` creation and accounting+interactions between users with restaked native ETH and the `DelegationManager`. -* The `DelayedWithdrawalRouter` imposes a 7-day delay on completing partial beacon chain withdrawals from an `EigenPod`. This is primarily to add a stopgap against a hack being able to instantly withdraw funds (note that all withdrawals from EigenLayer -- other than partial withdrawals earned by validators -- are initiated via the `DelegationManager`). -* The `EigenLayerBeaconOracle` provides beacon chain block roots for use in various proofs. The oracle is supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)). -See full documentation in [`/core/EigenPodManager.md`](./core/EigenPodManager.md). +See full documentation in: +* [`/core/EigenPodManager.md`](./core/EigenPodManager.md) +* [`/core/EigenPod.md`](./core/EigenPod.md) #### StrategyManager @@ -121,8 +119,7 @@ Stakers can restake any combination of these: a Staker may hold ALL of these ass * Stakers **withdraw** assets via the DelegationManager, *no matter what assets they're withdrawing* * Stakers **delegate** to an Operator via the DelegationManager -Unimplemented as of M2: -* Stakers earn yield by delegating to an Operator as the Operator provides services to an AVS +*Unimplemented as of v0.4.0:* * Stakers are at risk of being slashed if the Operator misbehaves ##### Operator @@ -134,8 +131,7 @@ An Operator is a user who helps run the software built on top of EigenLayer (AVS * Operators can **deposit** and **withdraw** assets just like Stakers can * Operators can opt in to providing services for an AVS using that AVS's middleware contracts. See the [EigenLayer middleware][middleware-repo] repo for more details. -*Unimplemented as of M2:* -* Operators earn fees as part of the services they provide +*Unimplemented as of v0.4.0:* * Operators may be slashed by the services they register with (if they misbehave) --- diff --git a/docs/core/EigenPod.md b/docs/core/EigenPod.md index 6d698e20f..bf7d9e155 100644 --- a/docs/core/EigenPod.md +++ b/docs/core/EigenPod.md @@ -46,7 +46,7 @@ Because beacon chain proofs are processed asynchronously from the beacon chain i * A validator enters the _active validator set_ when their withdrawal credentials are verified (see [`verifyWithdrawalCredentials`](#verifywithdrawalcredentials)) * A validator leaves the _active validator set_ when a checkpoint proof shows they have 0 balance (see [`verifyCheckpointProofs`](#verifycheckpointproofs)) -In the implemtation, the _active validator set_ is comprised of two state variables: +In the implementation, the _active validator set_ is comprised of two state variables: * `uint256 activeValidatorCount` * incremented by 1 when a validator enters the _active validator set_ * decremented by 1 when a validator leaves the _active validator set_ @@ -106,7 +106,8 @@ A withdrawal credential proof uses a validator's [`ValidatorIndex`][custom-types * `pubkey`: A BLS pubkey hash, used to uniquely identify the validator within the `EigenPod` * `withdrawal_credentials`: Used to verify that the validator will withdraw its principal to this `EigenPod` if it exits the beacon chain * `effective_balance`: The balance of the validator, updated once per epoch and capped at 32 ETH. Used to award shares to the Pod Owner -* `exit_epoch`: Initially set to `type(uint64).max`, this value is updated when a validator initiates exit from the beacon chain. This method requires that a validator _has not initiated an exit from the beacon chain_ +* `exit_epoch`: Initially set to `type(uint64).max`, this value is updated when a validator initiates exit from the beacon chain. **This method requires that a validator has not initiated an exit from the beacon chain.** + * If a validator has been exited prior to calling `verifyWithdrawalCredentials`, their ETH can be accounted for, awarded shares, and/or withdrawn via the checkpoint system (see [Checkpointing Validators](#checkpointing-validators)). _Note that it is not required to verify your validator's withdrawal credentials_, unless you want to receive shares for ETH on the beacon chain. You may choose to use your `EigenPod` without verifying withdrawal credentials; you will still be able to withdraw yield (or receive shares for yield) via the [checkpoint system](#checkpointing-validators). @@ -118,7 +119,7 @@ _Note that it is not required to verify your validator's withdrawal credentials_ * `restakedBalanceGwei` is set to the validator's effective balance * `lastCheckpointedAt` is set to either the `lastCheckpointTimestamp` or `currentCheckpointTimestamp` * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE` -* The Pod Owner is awarded shares according to the sum of effective balances proven. See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO) +* The Pod Owner is awarded shares according to the sum of effective balances proven. See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate) *Requirements*: * Caller MUST be the Pod Owner @@ -128,14 +129,14 @@ _Note that it is not required to verify your validator's withdrawal credentials_ * Input array lengths MUST be equal * `beaconTimestamp`: * MUST be greater than BOTH `lastCheckpointTimestamp` AND `currentCheckpointTimestamp` - * MUST be queryable via the [EIP-4788 oracle][eip-4788]. Generally, this means `beaconTimestamp` corresponds to a valid beacon block created within the last 24 hours. + * MUST be queryable via the [EIP-4788 oracle][eip-4788]. Generally, this means `beaconTimestamp` corresponds to a valid beacon block created within the last 8192 blocks (~27 hours). * `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle * For each validator: * The validator MUST NOT have been previously-verified (`VALIDATOR_STATUS` should be `INACTIVE`) * The validator's `exit_epoch` MUST equal `type(uint64).max` (aka `FAR_FUTURE_EPOCH`) * The validator's `withdrawal_credentials` MUST be pointed to the `EigenPod` * `validatorFieldsProof` MUST be a valid merkle proof of the corresponding `validatorFields` under the `beaconStateRoot` at the given `validatorIndex` -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO) +* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate) --- @@ -192,7 +193,7 @@ This guarantee means that, if we use the checkpoint to sum up the beacon chain b * `withdrawableRestakedExecutionLayerGwei` is increased by `checkpoint.podBalanceGwei` * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp` * `currentCheckpointTimestamp` and `_currentCheckpoint` are deleted - * The Pod Owner's shares are updated (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#TODO)) + * The Pod Owner's shares are updated (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate)) * If `hasRestaked == false`, sets `hasRestaked` to `true` (see [Compatibility with Previous Versions](#compatibility-with-previous-versions)) *Requirements*: @@ -244,7 +245,7 @@ Each valid proof submitted decreases the _current checkpoint's_ `proofsRemaining * If the checkpoint's `proofsRemaining` drops to 0, the checkpoint is automatically completed: * `checkpoint.podBalanceGwei` is added to `withdrawableRestakedExecutionLayerGwei`, rendering it accounted for in future checkpoints * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp`, and both `_currentCheckpoint` and `currentCheckpointTimestamp` are deleted. - * The Pod Owner's total share delta is calculated as the sum of `checkpoint.podBalanceGwei` and `checkpoint.balanceDeltasGwei`, and forwarded to the `EigenPodManager` (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](TODO)) + * The Pod Owner's total share delta is calculated as the sum of `checkpoint.podBalanceGwei` and `checkpoint.balanceDeltasGwei`, and forwarded to the `EigenPodManager` (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate)) *Requirements*: * Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CHECKPOINT_PROOFS` @@ -256,7 +257,16 @@ Each valid proof submitted decreases the _current checkpoint's_ `proofsRemaining ### Staleness Proofs -TODO +Regular checkpointing of validators plays an important role in the health of the system, as a completed checkpoint ensures that the pod's shares and backing assets are up to date. + +Typically, checkpoints can only be started by the Pod Owner (see [`startCheckpoint`](#startcheckpoint)). This is because completing a checkpoint with a lot of validators has the potential to be an expensive operation, so gating `startCheckpoint` to only be callable by the Pod Owner prevents a griefing vector where anyone can cheaply force the Pod Owner to perform a checkpoint. + +In most cases, Pod Owners are incentivized to perform their own regular checkpoints, as completing checkpoints is the only way to access yield sent to the pod. However, if beacon chain validators are slashed, it's possible that a Pod Owner no longer has an incentive to start/complete a checkpoint. After all, they would be losing shares equal to the slashed amount. Unless they have enough unclaimed yield in the pod to make up for this, they only stand to lose by completing a checkpoint. + +In this case, `verifyStaleBalance` can be used to allow a third party to start a checkpoint on the Pod Owner's behalf. + +*Methods*: +* [`verifyStaleBalance`](#verifystalebalance) #### `verifyStaleBalance` @@ -271,13 +281,43 @@ function verifyStaleBalance( onlyWhenNotPaused(PAUSED_VERIFY_STALE_BALANCE) ``` -TODO +Allows anyone to prove that a validator in the pod's _active validator set_ was slashed on the beacon chain. A successful proof allows the caller to start a checkpoint. Note that if the pod currently has an active checkpoint, the existing checkpoint needs to be completed before `verifyStaleBalance` can start a checkpoint. + +A valid proof has the following requirements: +* The `beaconTimestamp` MUST be newer than the timestamp the validator was last checkpointed at +* The validator in question MUST be in the _active validator set_ (have the status `VALIDATOR_STATUS.ACTIVE`) +* The proof MUST show that the validator has been slashed + +If these requirements are met and the proofs are valid against a beacon block root given by `beaconTimestamp`, a checkpoint is started. + +*Effects*: +* Sets `currentCheckpointTimestamp` to `block.timestamp` +* Creates a new `Checkpoint`: + * `beaconBlockRoot`: set to the current block's parent beacon block root, fetched by querying the [EIP-4788 oracle][eip-4788] using `block.timestamp` as input. + * `proofsRemaining`: set to the current value of `activeValidatorCount` + * `podBalanceGwei`: set to the pod's native ETH balance, minus any balance already accounted for in previous checkpoints + * `balanceDeltasGwei`: set to 0 initially + +*Requirements*: +* Pause status MUST NOT be set: `PAUSED_START_CHECKPOINT` +* Pause status MUST NOT be set: `PAUSED_VERIFY_STALE_BALANCE` +* A checkpoint MUST NOT be active (`currentCheckpointTimestamp == 0`) +* The last checkpoint completed MUST NOT be the current block +* For the validator given by `proof.validatorFields`: + * `beaconTimestamp` MUST be greater than `validatorInfo.lastCheckpointedAt` + * `validatorInfo.status` MUST be `VALIDATOR_STATUS.ACTIVE` + * `proof.validatorFields` MUST show that the validator is slashed +* `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle +* The `ValidatorProof` MUST contain a valid merkle proof of the corresponding `validatorFields` under the `beaconStateRoot` at `validatorInfo.validatorIndex` --- ### Other Methods -TODO +Minor methods that do not fit well into other sections: +* [`stake`](#stake) +* [`withdrawRestakedBeaconChainETH`](#withdrawrestakedbeaconchaineth) +* [`recoverTokens`](#recovertokens) #### `stake` @@ -292,7 +332,15 @@ function stake( onlyEigenPodManager ``` -TODO +Handles the call to the beacon chain deposit contract. Only called via `EigenPodManager.stake`. + +*Effects*: +* Deposits 32 ETH into the beacon chain deposit contract, and provides the pod's address as the deposit's withdrawal credentials + +*Requirements*: +* Caller MUST be the `EigenPodManager` +* Call value MUST be 32 ETH +* Deposit contract `deposit` method MUST succeed given the provided `pubkey`, `signature`, and `depositDataRoot` #### `withdrawRestakedBeaconChainETH` @@ -305,7 +353,19 @@ function withdrawRestakedBeaconChainETH( onlyEigenPodManager ``` -TODO +The `EigenPodManager` calls this method when withdrawing a Pod Owner's shares as tokens (native ETH). The input `amountWei` is converted to Gwei and subtracted from `withdrawableRestakedExecutionLayerGwei`, which tracks native ETH balance that has been accounted for in a checkpoint (see [Checkpointing Validators](#checkpointing-validators)). + +If the `EigenPod` does not have `amountWei` available to transfer, this method will revert + +*Effects*: +* Decreases the pod's `withdrawableRestakedExecutionLayerGwei` by `amountWei / GWEI_TO_WEI` +* Sends `amountWei` ETH to `recipient` + +*Requirements*: +* `amountWei / GWEI_TO_WEI` MUST NOT be greater than the proven `withdrawableRestakedExecutionLayerGwei` +* Pod MUST have at least `amountWei` ETH balance +* `recipient` MUST NOT revert when transferred `amountWei` +* `amountWei` MUST be a whole Gwei amount #### `recoverTokens` @@ -320,7 +380,15 @@ function recoverTokens( onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) ``` -TODO +Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`. + +*Effects:* +* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient` + +*Requirements:* +* Caller MUST be the Pod Owner +* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` +* `tokenList` and `amountsToWithdraw` MUST have equal lengths --- diff --git a/docs/core/EigenPodManager.md b/docs/core/EigenPodManager.md index 340a363c5..fde955d9f 100644 --- a/docs/core/EigenPodManager.md +++ b/docs/core/EigenPodManager.md @@ -42,7 +42,7 @@ function createPod() Allows a Staker to deploy an `EigenPod` instance, if they have not done so already. -Each Staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the Staker's address as the Create2 salt. +Each Staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the fee recipient / withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the Staker's address as the Create2 salt. As part of the `EigenPod` deployment process, the Staker is made the Pod Owner, a permissioned role within the `EigenPod`. @@ -84,7 +84,7 @@ Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, provid ### Withdrawal Processing -The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the following method is used: +The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the `DelegationManager` calls the following method: * [`removeShares`](#removeshares) When completing a queued undelegation or withdrawal, the `DelegationManager` calls one of these two methods: diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 1a317d058..52922d9a3 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -9,13 +9,6 @@ import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; * @title The implementation contract used for restaking beacon chain ETH on EigenLayer * @author Layr Labs, Inc. * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service - * @notice The main functionalities are: - * - creating new ETH validators with their withdrawal credentials pointed to this contract - * - proving from beacon chain state roots that withdrawal credentials are pointed to this contract - * - proving from beacon chain state roots the balances of ETH validators with their withdrawal credentials - * pointed to this contract - * - updating aggregate balances in the EigenPodManager - * - withdrawing eth when withdrawals are initiated * @dev Note that all beacon chain balances are stored as gwei within the beacon chain datastructures. We choose * to account balances in terms of gwei in the EigenPod contract and convert to wei when making calls to other contracts */ @@ -209,7 +202,7 @@ interface IEigenPod { /// @notice The owner of this EigenPod function podOwner() external view returns (address); - /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. + /// @notice TODO function hasRestaked() external view returns (bool); /// @notice Returns the validatorInfo struct for the provided pubkeyHash diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 490ebdf5a..08b387050 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -262,6 +262,15 @@ contract EigenPod is "EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length" ); + // Prevents two edge cases: + // 1. Calling this method using a `beaconTimestamp` <= `currentCheckpointTimestamp` would allow + // a newly-verified validator to be submitted to `verifyCheckpointProofs`, making progress + // on an existing checkpoint. + // 2. Calling this method using a `beaconTimestamp` <= `current/lastCheckpointTimestamp` might allow + // a newly-verified validator to already be exited and included in the previous checkpoint's + // native ETH balance (`podBalanceGwei`). This would result in shares being awarded for the + // validator twice. As an additional safety mechanism, `_verifyWithdrawalCredentials` also + // requires that the validator being proven has not initiated an exit. require( beaconTimestamp > lastCheckpointTimestamp && beaconTimestamp > currentCheckpointTimestamp, "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" @@ -450,7 +459,26 @@ contract EigenPod is "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" ); - // Validator should not already be in the process of exiting + // Validator should not already be in the process of exiting. + // + // Note that when a validator initiates an exit, two values are set: + // - exit_epoch + // - withdrawable_epoch + // + // The latter of these two values describes an epoch after which the validator's ETH MIGHT + // have been exited to the EigenPod, depending on the state of the beacon chain withdrawal + // queue. + // + // Requiring that a validator has not initiated exit by the time the EigenPod sees their + // withdrawal credentials guarantees that the validator has not fully exited at this point. + // + // This is because: + // - the earliest beacon chain slot allowed for withdrawal credential proofs is the earliest + // slot available in the EIP-4788 oracle, which keeps the last 8192 slots. + // - when initiating an exit, a validator's earliest possible withdrawable_epoch is equal to + // 1 + MAX_SEED_LOOKAHEAD + MIN_VALIDATOR_WITHDRAWABILITY_DELAY == 261 epochs (8352 slots). + // + // (See https://eth2book.info/capella/part3/helper/mutators/#initiate_validator_exit) require( validatorFields.getExitEpoch() == BeaconChainProofs.FAR_FUTURE_EPOCH, "EigenPod._verifyWithdrawalCredentials: validator must not be exiting" diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 1e71ebf98..6430e64ab 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -8,29 +8,25 @@ abstract contract EigenPodStorage is IEigenPod { /// @notice The owner of this EigenPod address public podOwner; - /** - * @notice The latest timestamp at which the pod owner withdrew the balance of the pod, via calling `withdrawBeforeRestaking`. - * @dev This variable is only updated when the `withdrawBeforeRestaking` function is called, which can only occur before `hasRestaked` is set to true for this pod. - * Proofs for this pod are only valid against Beacon Chain state roots corresponding to timestamps after the stored `mostRecentWithdrawalTimestamp`. - */ + /// @notice DEPRECATED: previously used to track the time when restaking was activated uint64 internal __deprecated_mostRecentWithdrawalTimestamp; /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), uint64 public withdrawableRestakedExecutionLayerGwei; - /// @notice an indicator of whether or not the podOwner has ever "fully restaked" by successfully calling `verifyCorrectWithdrawalCredentials`. + /// @notice TODO bool public hasRestaked; - /// @notice This is a mapping of validatorPubkeyHash to timestamp to whether or not they have proven a withdrawal for that timestamp + /// @notice DEPRECATED: previously tracked withdrawals proven per validator mapping(bytes32 => mapping(uint64 => bool)) internal __deprecated_provenWithdrawal; /// @notice This is a mapping that tracks a validator's information by their pubkey hash mapping(bytes32 => ValidatorInfo) internal _validatorPubkeyHashToInfo; - /// @notice This variable tracks any ETH deposited into this contract via the `receive` fallback function + /// @notice DEPRECATED: previously used to track ETH sent to the fallback function uint256 internal __deprecated_nonBeaconChainETHBalanceWei; - /// @notice This variable tracks the total amount of partial withdrawals claimed via merkle proofs prior to a switch to ZK proofs for claiming partial withdrawals + /// @notice DEPRECATED: previously used to track claimed partial withdrawals uint64 __deprecated_sumOfPartialWithdrawalsClaimedGwei; /// @notice Number of validators with proven withdrawal credentials, who do not have proven full withdrawals From 44115a770e822b071931f531aa5d1b452e76d80b Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 26 Jun 2024 15:12:06 +0000 Subject: [PATCH 35/85] feat: remove hasRestaked and lastCheckpointTimestamp checks --- docs/core/EigenPod.md | 26 +-- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 179 +----------------- pkg/bindings/EigenPodManager/binding.go | 2 +- pkg/bindings/EigenPodStorage/binding.go | 177 +---------------- pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/IEigenPod/binding.go | 177 +---------------- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- script/deploy/mainnet/M2Deploy.s.sol | 24 --- src/contracts/interfaces/IEigenPod.sol | 8 +- src/contracts/pods/EigenPod.sol | 40 ++-- src/contracts/pods/EigenPodStorage.sol | 4 +- src/test/unit/EigenPodUnit.t.sol | 86 ++------- 17 files changed, 44 insertions(+), 693 deletions(-) diff --git a/docs/core/EigenPod.md b/docs/core/EigenPod.md index bf7d9e155..494c78225 100644 --- a/docs/core/EigenPod.md +++ b/docs/core/EigenPod.md @@ -33,7 +33,6 @@ Because beacon chain proofs are processed asynchronously from the beacon chain i * [Checkpointing Validators](#checkpointing-validators) * [Staleness Proofs](#staleness-proofs) * [Other Methods](#other-methods) -* [Compatibility with Previous Versions](#compatibility-with-previous-versions) #### Important Definitions @@ -124,11 +123,9 @@ _Note that it is not required to verify your validator's withdrawal credentials_ *Requirements*: * Caller MUST be the Pod Owner * Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS` -* `hasRestaked` MUST be set to `true` - * Note: for the majority of pods, this is `true` by default (see [Compatibility with Previous Versions](#compatibility-with-previous-versions)) * Input array lengths MUST be equal * `beaconTimestamp`: - * MUST be greater than BOTH `lastCheckpointTimestamp` AND `currentCheckpointTimestamp` + * MUST be greater than `currentCheckpointTimestamp` * MUST be queryable via the [EIP-4788 oracle][eip-4788]. Generally, this means `beaconTimestamp` corresponds to a valid beacon block created within the last 8192 blocks (~27 hours). * `stateRootProof` MUST verify a `beaconStateRoot` against the `beaconBlockRoot` returned from the EIP-4788 oracle * For each validator: @@ -194,7 +191,6 @@ This guarantee means that, if we use the checkpoint to sum up the beacon chain b * `lastCheckpointTimestamp` is set to `currentCheckpointTimestamp` * `currentCheckpointTimestamp` and `_currentCheckpoint` are deleted * The Pod Owner's shares are updated (see [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](./EigenPodManager.md#recordbeaconchainethbalanceupdate)) -* If `hasRestaked == false`, sets `hasRestaked` to `true` (see [Compatibility with Previous Versions](#compatibility-with-previous-versions)) *Requirements*: * Caller MUST be the Pod Owner @@ -390,23 +386,3 @@ Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`. * Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` * `tokenList` and `amountsToWithdraw` MUST have equal lengths ---- - -### Compatibility with Previous Versions - -Although all `EigenPods` are updated simultaneously via the `BeaconProxy` pattern, previous versions of `EigenPods` have had slightly different state models that need to be accounted for in the latest release. There are two prior major versions of `EigenPod`: -* Pods deployed after M2 mainnet ("M2 Pods") were deployed with `EigenPod.hasRestaked` set to `true`. This is the default behavior for any new `EigenPods`. -* Pods deployed during M1 mainnet ("M1 Pods") were deployed with `EigenPod.hasRestaked` set to `false`. After M2 mainnet, owners of M1 Pods had two options: - * Choose not to "fully upgrade" to an M2 Pod, and continue withdrawing ETH from the pod at will via [`EigenPod.withdrawBeforeRestaking`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v0.2.5-mainnet-m2-minor-eigenpod-upgrade/src/contracts/pods/EigenPod.sol#L403-L406). - * Call [`EigenPod.activateRestaking`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/v0.2.5-mainnet-m2-minor-eigenpod-upgrade/src/contracts/pods/EigenPod.sol#L386-L401), setting `EigenPod.hasRestaked` to `true` and performing one final withdrawal of any ETH in the pod. - -Generally, M1 Pods that chose to activate restaking are identical to M2 Pods - so for the sake of clarity, "M1 Pods" will refer to pods that were deployed _before M2_ and _did not call `activateRestaking`_ at any point. - -This latest release brings M1 and M2 pods together, forcing both pods to use the same state model while supporting the original behavior that M1 Pod owners prefer. To clarify, M1 Pod owners have never called `verifyWithdrawalCredentials` for any validators, and have therefore never earned restaking shares for any validators. However, M1 Pod owners are also able to withdraw yield without supplying withdrawal proofs required by M2 Pods. - -There are a few user groups supported by this release. Note that M2 Pod Owners don't need to do anything special and can begin using the new `EigenPod` ABI as-is. - -#### M1 Pod Owners that want to maintain M1 Pod behavior - -#### M1 Pod Owners that want to start restaking now that proofs are cheaper - diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 60c3889c4..ce3934a80 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220eab8987739ab3fc1507e292834995e5e9d5e07aa633cb4e409b42ab40c12ed3764736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220cd336c6f618e5fa9767b3ad1d84de4769d0eccf227d824f42ce46b5bca438c4464736f6c634300080c0033", } // AVSDirectoryABI 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 a941fadce..db757685c 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,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\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220fb4eae5d392329a7b7ebba81e035ea073c49f1dbe1024cd543da4599c25d6cde64736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212203c57c9e23104ebc2a0128fe31db43aafa15273f0b54e3f92f420cdaecc73c5f464736f6c634300080c0033", } // DelegationManagerABI 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 0ab86eb5e..510fb3946 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -72,8 +72,8 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x60e06040523480156200001157600080fd5b506040516200499c3803806200499c833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c05161477e6200021e60003960006105aa0152600081816102c8015281816105e50152818161069701528181610a5501528181610d9b01528181610f5a0152818161105f015281816112ff0152818161174b015281816118f4015261309d015260008181610483015261112a015261477e6000f3fe6080604052600436106101445760003560e01c80636fcd0e53116100b6578063c49074421161006f578063c4907442146104f8578063c4d66de814610518578063dda3346c14610538578063ee94d67c14610558578063f074ba6214610578578063f28824611461059857600080fd5b80636fcd0e531461040d5780637439841f1461043a57806374cdd7981461047157806388676cad146104a55780639b4e4634146104c5578063b522538a146104d857600080fd5b80633f65cf19116101085780633f65cf191461026f57806342ecff2a1461028f5780634665bcda146102b657806347d28372146102ea57806352396a59146103aa57806358eaee79146103e057600080fd5b8063039157d2146101835780630b18ff66146101a55780632340e8d3146101e25780633106ab53146102065780633474aa161461023757600080fd5b3661017e576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018f57600080fd5b506101a361019e366004613ac6565b6105cc565b005b3480156101b157600080fd5b506033546101c5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101ee57600080fd5b506101f860395481565b6040519081526020016101d9565b34801561021257600080fd5b5060345461022790600160401b900460ff1681565b60405190151581526020016101d9565b34801561024357600080fd5b50603454610257906001600160401b031681565b6040516001600160401b0390911681526020016101d9565b34801561027b57600080fd5b506101a361028a366004613b84565b610a12565b34801561029b57600080fd5b50603a5461025790600160401b90046001600160401b031681565b3480156102c257600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156102f657600080fd5b506103666040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101d991908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b3480156103b657600080fd5b506102576103c5366004613c52565b603b602052600090815260409020546001600160401b031681565b3480156103ec57600080fd5b506104006103fb366004613cae565b610e05565b6040516101d99190613d27565b34801561041957600080fd5b5061042d610428366004613d35565b610e6a565b6040516101d99190613d4e565b34801561044657600080fd5b50610400610455366004613d35565b600090815260366020526040902054600160c01b900460ff1690565b34801561047d57600080fd5b506101c57f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b157600080fd5b506101a36104c0366004613da4565b610f17565b6101a36104d3366004613dc1565b611054565b3480156104e457600080fd5b5061042d6104f3366004613cae565b611201565b34801561050457600080fd5b506101a3610513366004613e54565b6112f4565b34801561052457600080fd5b506101a3610533366004613e80565b611531565b34801561054457600080fd5b506101a3610553366004613f71565b611708565b34801561056457600080fd5b50603a54610257906001600160401b031681565b34801561058457600080fd5b506101a3610593366004614042565b6118db565b3480156105a457600080fd5b506102577f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906140aa565b1561067e5760405162461bcd60e51b8152600401610675906140c7565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070a91906140aa565b156107275760405162461bcd60e51b8152600401610675906140c7565b600061076d6107368580614124565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2e92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107dc576107dc613cef565b60028111156107ed576107ed613cef565b81525050905080604001516001600160401b0316876001600160401b031611610880576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e7665726966795374616c6542616c616e63653a2070726f60448201527f6f66206973206f6c646572207468616e206c61737420636865636b706f696e746064820152608401610675565b60018160600151600281111561089857610898613cef565b146109025760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610675565b61094661090f8680614124565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d5292505050565b6109ca5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610675565b6109dc6109d688611d7c565b87611f31565b6109ff86356109eb8780614124565b6109f860208a018a61416d565b865161208c565b610a0960006122a3565b50505050505050565b6033546001600160a01b03163314610a3c5760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610aa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac891906140aa565b15610ae55760405162461bcd60e51b8152600401610675906140c7565b603454600160401b900460ff16610b645760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2072657374616b696e67206e6f74206163746976650000000000006064820152608401610675565b8584148015610b7257508382145b610c025760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610675565b603a546001600160401b03908116908a16118015610c355750603a546001600160401b03600160401b9091048116908a16115b610cbc5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610675565b610cce610cc88a611d7c565b89611f31565b6000805b87811015610d7157610d538a358a8a84818110610cf157610cf16141fb565b9050602002016020810190610d069190614211565b898985818110610d1857610d186141fb565b9050602002810190610d2a919061416d565b898987818110610d3c57610d3c6141fb565b9050602002810190610d4e9190614124565b612525565b610d5d908361424e565b915080610d6981614266565b915050610cd2565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610de157600080fd5b505af1158015610df5573d6000803e3d6000fd5b5050505050505050505050505050565b600080610e4784848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7292505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610e926040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610efd57610efd613cef565b6002811115610f0e57610f0e613cef565b90525092915050565b6033546001600160a01b03163314610f415760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fcd91906140aa565b15610fea5760405162461bcd60e51b8152600401610675906140c7565b610ff3826122a3565b603454600160401b900460ff16611050576034805460ff60401b1916600160401b1790556033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a25b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461109c5760405162461bcd60e51b815260040161067590614281565b346801bc16d674ec800000146111285760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec800000878761116b612b6c565b8888886040518863ffffffff1660e01b815260040161118f96959493929190614357565b6000604051808303818588803b1580156111a857600080fd5b505af11580156111bc573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516111f29291906143a6565b60405180910390a15050505050565b6112296040805160808101825260008082526020820181905291810182905290606082015290565b6036600061126c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7292505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156112d9576112d9613cef565b60028111156112ea576112ea613cef565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461133c5760405162461bcd60e51b815260040161067590614281565b61134a633b9aca00826143d0565b156113d45760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610675565b60006113e4633b9aca00836143e4565b6034549091506001600160401b03908116908216111561149d5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610675565b603480548291906000906114bb9084906001600160401b03166143f8565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161151a91815260200190565b60405180910390a261152c8383612bb1565b505050565b600054610100900460ff16158080156115515750600054600160ff909116105b8061156b5750303b15801561156b575060005460ff166001145b6115ce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610675565b6000805460ff1916600117905580156115f1576000805461ff0019166101001790555b6001600160a01b0382166116645760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610675565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611050576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146117325760405162461bcd60e51b8152600401610675906141b3565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa15801561179a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117be91906140aa565b156117db5760405162461bcd60e51b8152600401610675906140c7565b82518451146118665760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610675565b60005b84518110156118d4576118c283858381518110611888576118886141fb565b60200260200101518784815181106118a2576118a26141fb565b60200260200101516001600160a01b0316612cca9092919063ffffffff16565b806118cc81614266565b915050611869565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196791906140aa565b156119845760405162461bcd60e51b8152600401610675906140c7565b603a54600160401b90046001600160401b031680611a305760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610675565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b606082015290611a809087612d1c565b6000805b85811015611cd45736878783818110611a9f57611a9f6141fb565b9050602002810190611ab19190614420565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611b2257611b22613cef565b6002811115611b3357611b33613cef565b9052509050600181606001516002811115611b5057611b50613cef565b14611b5c575050611cc2565b856001600160401b031681604001516001600160401b031610611b80575050611cc2565b600080611b9083898e3587612e98565b602089018051929450909250611ba582614440565b62ffffff16905250606087018051839190611bc190839061445f565b600f0b905250611bd181876144ae565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611c7657611c76613cef565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611ccc81614266565b915050611a84565b506001600160401b038084166000908152603b6020526040812080548493919291611d01918591166144ae565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550610a0982612fba565b600081600081518110611d4357611d436141fb565b60200260200101519050919050565b600081600381518110611d6757611d676141fb565b60200260200101516000801b14159050919050565b6000611d8b611fff600c6144d9565b611d9e6001600160401b038416426144f8565b10611e085760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610675565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611e509161450f565b600060405180830381855afa9150503d8060008114611e8b576040519150601f19603f3d011682016040523d82523d6000602084013e611e90565b606091505b5091509150818015611ea3575060008151115b611f155760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610675565b80806020019051810190611f299190614521565b949350505050565b611f3d600360206144d9565b611f4a602083018361416d565b905014611fbf5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610675565b61200f611fcf602083018361416d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250869250508435905060036131c1565b6110505760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610675565b600884146121075760405162461bcd60e51b815260206004820152604e602482015260008051602061472983398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610675565b60056121156028600161424e565b61211f919061424e565b61212a9060206144d9565b82146121985760405162461bcd60e51b8152602060048201526043602482015260008051602061472983398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610675565b60006121d68686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131d992505050565b9050600064ffffffffff83166121ee6028600161424e565b600b901b17905061223985858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508691508590506131c1565b6122995760405162461bcd60e51b815260206004820152603d602482015260008051602061472983398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610675565b5050505050505050565b603a54600160401b90046001600160401b0316156123445760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610675565b603a54426001600160401b03908116911614156123c95760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610675565b6034546000906001600160401b03166123e6633b9aca00476143e4565b6123f091906143f8565b905081801561240657506001600160401b038116155b156124795760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610675565b6000604051806080016040528061248f42611d7c565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b031602179055506124ea81612fba565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b600080612564848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611d2e92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156125d3576125d3613cef565b60028111156125e4576125e4613cef565b905250905060008160600151600281111561260157612601613cef565b146126a45760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610675565b6001600160401b0380166126ea86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061348692505050565b6001600160401b0316146127745760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610675565b61277c612b6c565b6127859061453a565b6127c18686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134ab92505050565b146128425760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610675565b60006128808686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134c092505050565b90506128908a87878b8b8e61208c565b603980549060006128a083614266565b9091555050603a54600090600160401b90046001600160401b0316156128d857603a54600160401b90046001600160401b03166128e5565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156129bb576129bb613cef565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a1612a63633b9aca006001600160401b0384166144d9565b9b9a5050505050505050505050565b60008151603014612afb5760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610675565b604051600290612b1290849060009060200161455e565b60408051601f1981840301815290829052612b2c9161450f565b602060405180830381855afa158015612b49573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610e649190614521565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b80471015612c015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610675565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c4e576040519150601f19603f3d011682016040523d82523d6000602084013e612c53565b606091505b505090508061152c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610675565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261152c9084906134d8565b612d286005600361424e565b612d339060206144d9565b612d40602083018361416d565b905014612dc35760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b606c612e14612dd5602084018461416d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508792505085359050846131c1565b61152c5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610675565b83516020850151600091829182612eb08784886135aa565b9050816001600160401b0316816001600160401b031614612f2a57612ed58183613721565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612fae5760398054906000612f588361458d565b9091555050600260608a0152612f6d856145a4565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff16613141576000633b9aca00826060015183604001516001600160401b0316612fec919061445f565b600f0b612ff991906145cb565b604083015160348054929350909160009061301e9084906001600160401b03166144ae565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b1580156130e357600080fd5b505af11580156130f7573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b6000836131cf868585613739565b1495945050505050565b600080600283516131ea91906143e4565b90506000816001600160401b0381111561320657613206613e9d565b60405190808252806020026020018201604052801561322f578160200160208202803683370190505b50905060005b828110156133365760028561324a83836144d9565b8151811061325a5761325a6141fb565b60200260200101518683600261327091906144d9565b61327b90600161424e565b8151811061328b5761328b6141fb565b60200260200101516040516020016132ad929190918252602082015260400190565b60408051601f19818403018152908290526132c79161450f565b602060405180830381855afa1580156132e4573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906133079190614521565b828281518110613319576133196141fb565b60209081029190910101528061332e81614266565b915050613235565b506133426002836143e4565b91505b81156134625760005b8281101561344f5760028261336383836144d9565b81518110613373576133736141fb565b60200260200101518383600261338991906144d9565b61339490600161424e565b815181106133a4576133a46141fb565b60200260200101516040516020016133c6929190918252602082015260400190565b60408051601f19818403018152908290526133e09161450f565b602060405180830381855afa1580156133fd573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906134209190614521565b828281518110613432576134326141fb565b60209081029190910101528061344781614266565b91505061334e565b5061345b6002836143e4565b9150613345565b80600081518110613475576134756141fb565b602002602001015192505050919050565b6000610e648260068151811061349e5761349e6141fb565b6020026020010151613885565b600081600181518110611d4357611d436141fb565b6000610e648260028151811061349e5761349e6141fb565b600061352d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138ec9092919063ffffffff16565b80519091501561152c578080602001905181019061354b91906140aa565b61152c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610675565b60006135b86026600161424e565b6135c39060206144d9565b6135d0604084018461416d565b9050146136415760405162461bcd60e51b815260206004820152604460248201819052600080516020614729833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610675565b600061364e600485614650565b64ffffffffff1690506136a8613667604085018561416d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525089925050506020860135846131c1565b6137085760405162461bcd60e51b815260206004820152603e602482015260008051602061472983398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610675565b6137168360200135856138fb565b9150505b9392505050565b600061371a6001600160401b03808416908516614674565b6000835160001415801561375857506020845161375691906143d0565b155b6137e75760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610675565b604080516020808201909252848152905b8551811161387b5761380b6002856143d0565b61383e578151600052808601516020526020826040600060026107d05a03fa61383357600080fd5b600284049350613869565b8086015160005281516020526020826040600060026107d05a03fa61386257600080fd5b6002840493505b61387460208261424e565b90506137f8565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611f298484600085613928565b6000806139096004846146c4565b6139149060406146e8565b64ffffffffff169050611f2984821b613885565b6060824710156139895760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610675565b6001600160a01b0385163b6139e05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610675565b600080866001600160a01b031685876040516139fc919061450f565b60006040518083038185875af1925050503d8060008114613a39576040519150601f19603f3d011682016040523d82523d6000602084013e613a3e565b606091505b5091509150613a4e828286613a59565b979650505050505050565b60608315613a6857508161371a565b825115613a785782518084602001fd5b8160405162461bcd60e51b81526004016106759190614715565b80356001600160401b0381168114613aa957600080fd5b919050565b600060408284031215613ac057600080fd5b50919050565b600080600060608486031215613adb57600080fd5b613ae484613a92565b925060208401356001600160401b0380821115613b0057600080fd5b613b0c87838801613aae565b93506040860135915080821115613b2257600080fd5b50613b2f86828701613aae565b9150509250925092565b60008083601f840112613b4b57600080fd5b5081356001600160401b03811115613b6257600080fd5b6020830191508360208260051b8501011115613b7d57600080fd5b9250929050565b60008060008060008060008060a0898b031215613ba057600080fd5b613ba989613a92565b975060208901356001600160401b0380821115613bc557600080fd5b613bd18c838d01613aae565b985060408b0135915080821115613be757600080fd5b613bf38c838d01613b39565b909850965060608b0135915080821115613c0c57600080fd5b613c188c838d01613b39565b909650945060808b0135915080821115613c3157600080fd5b50613c3e8b828c01613b39565b999c989b5096995094979396929594505050565b600060208284031215613c6457600080fd5b61371a82613a92565b60008083601f840112613c7f57600080fd5b5081356001600160401b03811115613c9657600080fd5b602083019150836020828501011115613b7d57600080fd5b60008060208385031215613cc157600080fd5b82356001600160401b03811115613cd757600080fd5b613ce385828601613c6d565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613d2357634e487b7160e01b600052602160045260246000fd5b9052565b60208101610e648284613d05565b600060208284031215613d4757600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613d8f6060840182613d05565b5092915050565b80151581146131be57600080fd5b600060208284031215613db657600080fd5b813561371a81613d96565b600080600080600060608688031215613dd957600080fd5b85356001600160401b0380821115613df057600080fd5b613dfc89838a01613c6d565b90975095506020880135915080821115613e1557600080fd5b50613e2288828901613c6d565b96999598509660400135949350505050565b6001600160a01b03811681146131be57600080fd5b8035613aa981613e34565b60008060408385031215613e6757600080fd5b8235613e7281613e34565b946020939093013593505050565b600060208284031215613e9257600080fd5b813561371a81613e34565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613edb57613edb613e9d565b604052919050565b60006001600160401b03821115613efc57613efc613e9d565b5060051b60200190565b600082601f830112613f1757600080fd5b81356020613f2c613f2783613ee3565b613eb3565b82815260059290921b84018101918181019086841115613f4b57600080fd5b8286015b84811015613f665780358352918301918301613f4f565b509695505050505050565b600080600060608486031215613f8657600080fd5b83356001600160401b0380821115613f9d57600080fd5b818601915086601f830112613fb157600080fd5b81356020613fc1613f2783613ee3565b82815260059290921b8401810191818101908a841115613fe057600080fd5b948201945b83861015614007578535613ff881613e34565b82529482019490820190613fe5565b9750508701359250508082111561401d57600080fd5b5061402a86828701613f06565b92505061403960408501613e49565b90509250925092565b60008060006040848603121561405757600080fd5b83356001600160401b038082111561406e57600080fd5b61407a87838801613aae565b9450602086013591508082111561409057600080fd5b5061409d86828701613b39565b9497909650939450505050565b6000602082840312156140bc57600080fd5b815161371a81613d96565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e1984360301811261413b57600080fd5b8301803591506001600160401b0382111561415557600080fd5b6020019150600581901b3603821315613b7d57600080fd5b6000808335601e1984360301811261418457600080fd5b8301803591506001600160401b0382111561419e57600080fd5b602001915036819003821315613b7d57600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561422357600080fd5b813564ffffffffff8116811461371a57600080fd5b634e487b7160e01b600052601160045260246000fd5b6000821982111561426157614261614238565b500190565b600060001982141561427a5761427a614238565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156143165781810151838201526020016142fe565b83811115614325576000848401525b50505050565b600081518084526143438160208601602086016142fb565b601f01601f19169290920160200192915050565b60808152600061436b60808301888a6142d2565b828103602084015261437d818861432b565b905082810360408401526143928186886142d2565b915050826060830152979650505050505050565b602081526000611f296020830184866142d2565b634e487b7160e01b600052601260045260246000fd5b6000826143df576143df6143ba565b500690565b6000826143f3576143f36143ba565b500490565b60006001600160401b038381169083168181101561441857614418614238565b039392505050565b60008235605e1983360301811261443657600080fd5b9190910192915050565b600062ffffff82168061445557614455614238565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561448957614489614238565b8260016001607f1b03190382128116156144a5576144a5614238565b50019392505050565b60006001600160401b038083168185168083038211156144d0576144d0614238565b01949350505050565b60008160001904831182151516156144f3576144f3614238565b500290565b60008282101561450a5761450a614238565b500390565b600082516144368184602087016142fb565b60006020828403121561453357600080fd5b5051919050565b80516020808301519190811015613ac05760001960209190910360031b1b16919050565b600083516145708184602088016142fb565b6001600160801b0319939093169190920190815260100192915050565b60008161459c5761459c614238565b506000190190565b600081600f0b60016001607f1b03198114156145c2576145c2614238565b60000392915050565b60006001600160ff1b03818413828413808216868404861116156145f1576145f1614238565b600160ff1b600087128281168783058912161561461057614610614238565b6000871292508782058712848416161561462c5761462c614238565b8785058712818416161561464257614642614238565b505050929093029392505050565b600064ffffffffff80841680614668576146686143ba565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561469f5761469f614238565b8160016001607f1b030183138116156146ba576146ba614238565b5090039392505050565b600064ffffffffff808416806146dc576146dc6143ba565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561470c5761470c614238565b02949350505050565b60208152600061371a602083018461432b56fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220002ca3940b15bce6a4d5f27b0a1987d5e54e377a1f8883d1182d7970657188fd64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + Bin: "0x60e06040523480156200001157600080fd5b506040516200482a3803806200482a833981016040819052620000349162000142565b6001600160a01b03808416608052821660a0526001600160401b03811660c0526200005e62000067565b505050620001a1565b600054610100900460ff1615620000d45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000127576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013f57600080fd5b50565b6000806000606084860312156200015857600080fd5b8351620001658162000129565b6020850151909350620001788162000129565b60408501519092506001600160401b03811681146200019657600080fd5b809150509250925092565b60805160a05160c05161460c6200021e600039600061056e01526000818161028c015281816105a90152818161065b01528181610a1901528181610cc601528181610e8501528181610f2d015281816111cd015281816115d9015281816117820152612f2b0152600081816104470152610ff8015261460c6000f3fe6080604052600436106101395760003560e01c80637439841f116100ab578063c49074421161006f578063c4907442146104bc578063c4d66de8146104dc578063dda3346c146104fc578063ee94d67c1461051c578063f074ba621461053c578063f28824611461055c57600080fd5b80637439841f146103fe57806374cdd7981461043557806388676cad146104695780639b4e463414610489578063b522538a1461049c57600080fd5b806342ecff2a116100fd57806342ecff2a146102535780634665bcda1461027a57806347d28372146102ae57806352396a591461036e57806358eaee79146103a45780636fcd0e53146103d157600080fd5b8063039157d2146101785780630b18ff661461019a5780632340e8d3146101d75780633474aa16146101fb5780633f65cf191461023357600080fd5b36610173576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b34801561018457600080fd5b50610198610193366004613954565b610590565b005b3480156101a657600080fd5b506033546101ba906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101e357600080fd5b506101ed60395481565b6040519081526020016101ce565b34801561020757600080fd5b5060345461021b906001600160401b031681565b6040516001600160401b0390911681526020016101ce565b34801561023f57600080fd5b5061019861024e366004613a12565b6109d6565b34801561025f57600080fd5b50603a5461021b90600160401b90046001600160401b031681565b34801561028657600080fd5b506101ba7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ba57600080fd5b5061032a6040805160808101825260008082526020820181905291810182905260608101919091525060408051608081018252603c548152603d5462ffffff811660208301526001600160401b03630100000082041692820192909252600160581b909104600f0b606082015290565b6040516101ce91908151815260208083015162ffffff16908201526040808301516001600160401b031690820152606091820151600f0b9181019190915260800190565b34801561037a57600080fd5b5061021b610389366004613ae0565b603b602052600090815260409020546001600160401b031681565b3480156103b057600080fd5b506103c46103bf366004613b3c565b610d30565b6040516101ce9190613bb5565b3480156103dd57600080fd5b506103f16103ec366004613bc3565b610d95565b6040516101ce9190613bdc565b34801561040a57600080fd5b506103c4610419366004613bc3565b600090815260366020526040902054600160c01b900460ff1690565b34801561044157600080fd5b506101ba7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047557600080fd5b50610198610484366004613c32565b610e42565b610198610497366004613c4f565b610f22565b3480156104a857600080fd5b506103f16104b7366004613b3c565b6110cf565b3480156104c857600080fd5b506101986104d7366004613ce2565b6111c2565b3480156104e857600080fd5b506101986104f7366004613d0e565b6113ff565b34801561050857600080fd5b50610198610517366004613dff565b611596565b34801561052857600080fd5b50603a5461021b906001600160401b031681565b34801561054857600080fd5b50610198610557366004613ed0565b611769565b34801561056857600080fd5b5061021b7f000000000000000000000000000000000000000000000000000000000000000081565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156105f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061c9190613f38565b156106425760405162461bcd60e51b815260040161063990613f55565b60405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156106aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ce9190613f38565b156106eb5760405162461bcd60e51b815260040161063990613f55565b60006107316106fa8580613fb2565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bbc92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156107a0576107a0613b7d565b60028111156107b1576107b1613b7d565b81525050905080604001516001600160401b0316876001600160401b031611610844576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e7665726966795374616c6542616c616e63653a2070726f60448201527f6f66206973206f6c646572207468616e206c61737420636865636b706f696e746064820152608401610639565b60018160600151600281111561085c5761085c613b7d565b146108c65760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c604482015273696461746f72206973206e6f742061637469766560601b6064820152608401610639565b61090a6108d38680613fb2565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611be092505050565b61098e5760405162461bcd60e51b815260206004820152604960248201527f456967656e506f642e7665726966795374616c6542616c616e63653a2076616c60448201527f696461746f72206d75737420626520736c617368656420746f206265206d61726064820152686b6564207374616c6560b81b608482015260a401610639565b6109a061099a88611c0a565b87611dbf565b6109c386356109af8780613fb2565b6109bc60208a018a613ffb565b8651611f1a565b6109cd6000612131565b50505050505050565b6033546001600160a01b03163314610a005760405162461bcd60e51b815260040161063990614041565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8c9190613f38565b15610aa95760405162461bcd60e51b815260040161063990613f55565b8584148015610ab757508382145b610b475760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a401610639565b603a546001600160401b03600160401b9091048116908a1611610be75760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a401610639565b610bf9610bf38a611c0a565b89611dbf565b6000805b87811015610c9c57610c7e8a358a8a84818110610c1c57610c1c614089565b9050602002016020810190610c31919061409f565b898985818110610c4357610c43614089565b9050602002810190610c559190613ffb565b898987818110610c6757610c67614089565b9050602002810190610c799190613fb2565b6123b3565b610c8890836140dc565b915080610c94816140f4565b915050610bfd565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015610d0c57600080fd5b505af1158015610d20573d6000803e3d6000fd5b5050505050505050505050505050565b600080610d7284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061290092505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610dbd6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610e2857610e28613b7d565b6002811115610e3957610e39613b7d565b90525092915050565b6033546001600160a01b03163314610e6c5760405162461bcd60e51b815260040161063990614041565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610ed4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef89190613f38565b15610f155760405162461bcd60e51b815260040161063990613f55565b610f1e82612131565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f6a5760405162461bcd60e51b81526004016106399061410f565b346801bc16d674ec80000014610ff65760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a401610639565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876110396129fa565b8888886040518863ffffffff1660e01b815260040161105d969594939291906141e5565b6000604051808303818588803b15801561107657600080fd5b505af115801561108a573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e2385856040516110c0929190614234565b60405180910390a15050505050565b6110f76040805160808101825260008082526020820181905291810182905290606082015290565b6036600061113a85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061290092505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156111a7576111a7613b7d565b60028111156111b8576111b8613b7d565b9052509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461120a5760405162461bcd60e51b81526004016106399061410f565b611218633b9aca008261425e565b156112a25760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a401610639565b60006112b2633b9aca0083614272565b6034549091506001600160401b03908116908216111561136b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c401610639565b603480548291906000906113899084906001600160401b0316614286565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516113e891815260200190565b60405180910390a26113fa8383612a3f565b505050565b600054610100900460ff161580801561141f5750600054600160ff909116105b806114395750303b158015611439575060005460ff166001145b61149c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610639565b6000805460ff1916600117905580156114bf576000805461ff0019166101001790555b6001600160a01b0382166115325760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b6064820152608401610639565b603380546001600160a01b0319166001600160a01b0384161790558015610f1e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b031633146115c05760405162461bcd60e51b815260040161063990614041565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190613f38565b156116695760405162461bcd60e51b815260040161063990613f55565b82518451146116f45760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a401610639565b60005b8451811015611762576117508385838151811061171657611716614089565b602002602001015187848151811061173057611730614089565b60200260200101516001600160a01b0316612b589092919063ffffffff16565b8061175a816140f4565b9150506116f7565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f59190613f38565b156118125760405162461bcd60e51b815260040161063990613f55565b603a54600160401b90046001600160401b0316806118be5760405162461bcd60e51b815260206004820152605860248201527f456967656e506f642e766572696679436865636b706f696e7450726f6f66733a60448201527f206d75737420686176652061637469766520636865636b706f696e7420746f2060648201527f706572666f726d20636865636b706f696e742070726f6f660000000000000000608482015260a401610639565b60408051608081018252603c54808252603d5462ffffff811660208401526001600160401b03630100000082041693830193909352600160581b909204600f0b60608201529061190e9087612baa565b6000805b85811015611b62573687878381811061192d5761192d614089565b905060200281019061193f91906142ae565b80356000908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156119b0576119b0613b7d565b60028111156119c1576119c1613b7d565b90525090506001816060015160028111156119de576119de613b7d565b146119ea575050611b50565b856001600160401b031681604001516001600160401b031610611a0e575050611b50565b600080611a1e83898e3587612d26565b602089018051929450909250611a33826142ce565b62ffffff16905250606087018051839190611a4f9083906142ed565b600f0b905250611a5f818761433c565b84356000908152603660209081526040918290208651815492880151938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060870151939950869390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115611b0457611b04613b7d565b021790555050835160405164ffffffffff90911691506001600160401b038a16907fa91c59033c3423e18b54d0acecebb4972f9ea95aedf5f4cae3b677b02eaf3a3f90600090a3505050505b80611b5a816140f4565b915050611912565b506001600160401b038084166000908152603b6020526040812080548493919291611b8f9185911661433c565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109cd82612e48565b600081600081518110611bd157611bd1614089565b60200260200101519050919050565b600081600381518110611bf557611bf5614089565b60200260200101516000801b14159050919050565b6000611c19611fff600c614367565b611c2c6001600160401b03841642614386565b10611c965760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a2074696044820152736d657374616d70206f7574206f662072616e676560601b6064820152608401610639565b604080516001600160401b03841660208201526000918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611cde9161439d565b600060405180830381855afa9150503d8060008114611d19576040519150601f19603f3d011682016040523d82523d6000602084013e611d1e565b606091505b5091509150818015611d31575060008151115b611da35760405162461bcd60e51b815260206004820152603960248201527f456967656e506f642e5f676574506172656e74426c6f636b526f6f743a20696e60448201527f76616c696420626c6f636b20726f6f742072657475726e6564000000000000006064820152608401610639565b80806020019051810190611db791906143af565b949350505050565b611dcb60036020614367565b611dd86020830183613ffb565b905014611e4d5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a2050726f6f662068617320696e636f7272656374206c656e6774680000006064820152608401610639565b611e9d611e5d6020830183613ffb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508692505084359050600361304f565b610f1e5760405162461bcd60e51b815260206004820152604260248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f743a20496e76616c696420737461746520726f6f74206d65726b6c652070726f60648201526137b360f11b608482015260a401610639565b60088414611f955760405162461bcd60e51b815260206004820152604e60248201526000805160206145b783398151915260448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a401610639565b6005611fa3602860016140dc565b611fad91906140dc565b611fb8906020614367565b82146120265760405162461bcd60e51b815260206004820152604360248201526000805160206145b783398151915260448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a401610639565b600061206486868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061306792505050565b9050600064ffffffffff831661207c602860016140dc565b600b901b1790506120c785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925086915085905061304f565b6121275760405162461bcd60e51b815260206004820152603d60248201526000805160206145b783398151915260448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f660000006064820152608401610639565b5050505050505050565b603a54600160401b90046001600160401b0316156121d25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f642e5f7374617274436865636b706f696e743a206d7573742060448201527f66696e6973682070726576696f757320636865636b706f696e74206265666f72606482015271329039ba30b93a34b7339030b737ba3432b960711b608482015260a401610639565b603a54426001600160401b03908116911614156122575760405162461bcd60e51b815260206004820152603f60248201527f456967656e506f642e5f7374617274436865636b706f696e743a2063616e6e6f60448201527f7420636865636b706f696e7420747769636520696e206f6e6520626c6f636b006064820152608401610639565b6034546000906001600160401b0316612274633b9aca0047614272565b61227e9190614286565b905081801561229457506001600160401b038116155b156123075760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f642e5f7374617274436865636b706f696e743a206e6f20626160448201527f6c616e636520617661696c61626c6520746f20636865636b706f696e740000006064820152608401610639565b6000604051806080016040528061231d42611c0a565b815260200160395462ffffff168152602001836001600160401b031681526020016000600f0b815250905042603a60086101000a8154816001600160401b0302191690836001600160401b0316021790555061237881612e48565b80516040516001600160401b034216907f17a875d60c621f9c2f4d68122fe3a5bd359233b6fd8fcb79a0f65a6e433c6bf690600090a3505050565b6000806123f2848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611bbc92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561246157612461613b7d565b600281111561247257612472613b7d565b905250905060008160600151600281111561248f5761248f613b7d565b146125325760405162461bcd60e51b815260206004820152606160248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2076616c696461746f72206d75737420626520696e616374697660648201527f6520746f2070726f7665207769746864726177616c2063726564656e7469616c6084820152607360f81b60a482015260c401610639565b6001600160401b03801661257886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061331492505050565b6001600160401b0316146126025760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e5f7665726966795769746864726177616c43726564656e908201527f7469616c733a2076616c696461746f72206d757374206e6f742062652065786960648201526374696e6760e01b608482015260a401610639565b61260a6129fa565b612613906143c8565b61264f86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061333992505050565b146126d05760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e5f7665726966795769746864726177616c43726564656e60448201527f7469616c733a2070726f6f66206973206e6f7420666f72207468697320456967606482015264195b941bd960da1b608482015260a401610639565b600061270e86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061334e92505050565b905061271e8a87878b8b8e611f1a565b6039805490600061272e836140f4565b9091555050603a54600090600160401b90046001600160401b03161561276657603a54600160401b90046001600160401b0316612773565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190526000858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561284957612849613b7d565b02179055505060405164ffffffffff8c1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a16040805164ffffffffff8c1681526001600160401b03838116602083015284168183015290517f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df9181900360600190a16128f1633b9aca006001600160401b038416614367565b9b9a5050505050505050505050565b600081516030146129895760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a401610639565b6040516002906129a09084906000906020016143ec565b60408051601f19818403018152908290526129ba9161439d565b602060405180830381855afa1580156129d7573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d8f91906143af565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b80471015612a8f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610639565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612adc576040519150601f19603f3d011682016040523d82523d6000602084013e612ae1565b606091505b50509050806113fa5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610639565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526113fa908490613366565b612bb6600560036140dc565b612bc1906020614367565b612bce6020830183613ffb565b905014612c515760405162461bcd60e51b8152602060048201526044602482018190527f426561636f6e436861696e50726f6f66732e76657269667942616c616e636543908201527f6f6e7461696e65723a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610639565b606c612ca2612c636020840184613ffb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525087925050853590508461304f565b6113fa5760405162461bcd60e51b815260206004820152604960248201527f426561636f6e436861696e50726f6f66732e76657269667942616c616e63654360448201527f6f6e7461696e65723a20696e76616c69642062616c616e636520636f6e7461696064820152683732b910383937b7b360b91b608482015260a401610639565b83516020850151600091829182612d3e878488613438565b9050816001600160401b0316816001600160401b031614612db857612d6381836135af565b6040805164ffffffffff861681526001600160401b038b8116602083015284168183015290519196507f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df919081900360600190a15b6001600160401b0380821660208b0181905290891660408b0152612e3c5760398054906000612de68361441b565b9091555050600260608a0152612dfb85614432565b93508264ffffffffff16886001600160401b03167f2a02361ffa66cf2c2da4682c2355a6adcaa9f6c227b6e6563e68480f9587626a60405160405180910390a35b50505094509492505050565b602081015162ffffff16612fcf576000633b9aca00826060015183604001516001600160401b0316612e7a91906142ed565b600f0b612e879190614459565b6040830151603480549293509091600090612eac9084906001600160401b031661433c565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b81049092166001600160801b0319909216919091179055506000603c55603d80546001600160d81b031916905560335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c4090604401600060405180830381600087803b158015612f7157600080fd5b505af1158015612f85573d6000803e3d6000fd5b5050603a546040518481526001600160401b0390911692507f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e44915060200160405180910390a25050565b8051603c556020810151603d8054604084015160608501516fffffffffffffffffffffffffffffffff16600160581b026fffffffffffffffffffffffffffffffff60581b196001600160401b039092166301000000026affffffffffffffffffffff1990931662ffffff9095169490941791909117169190911790555b50565b60008361305d8685856135c7565b1495945050505050565b600080600283516130789190614272565b90506000816001600160401b0381111561309457613094613d2b565b6040519080825280602002602001820160405280156130bd578160200160208202803683370190505b50905060005b828110156131c4576002856130d88383614367565b815181106130e8576130e8614089565b6020026020010151868360026130fe9190614367565b6131099060016140dc565b8151811061311957613119614089565b602002602001015160405160200161313b929190918252602082015260400190565b60408051601f19818403018152908290526131559161439d565b602060405180830381855afa158015613172573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061319591906143af565b8282815181106131a7576131a7614089565b6020908102919091010152806131bc816140f4565b9150506130c3565b506131d0600283614272565b91505b81156132f05760005b828110156132dd576002826131f18383614367565b8151811061320157613201614089565b6020026020010151838360026132179190614367565b6132229060016140dc565b8151811061323257613232614089565b6020026020010151604051602001613254929190918252602082015260400190565b60408051601f198184030181529082905261326e9161439d565b602060405180830381855afa15801561328b573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906132ae91906143af565b8282815181106132c0576132c0614089565b6020908102919091010152806132d5816140f4565b9150506131dc565b506132e9600283614272565b91506131d3565b8060008151811061330357613303614089565b602002602001015192505050919050565b6000610d8f8260068151811061332c5761332c614089565b6020026020010151613713565b600081600181518110611bd157611bd1614089565b6000610d8f8260028151811061332c5761332c614089565b60006133bb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661377a9092919063ffffffff16565b8051909150156113fa57808060200190518101906133d99190613f38565b6113fa5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610639565b6000613446602660016140dc565b613451906020614367565b61345e6040840184613ffb565b9050146134cf5760405162461bcd60e51b8152602060048201526044602482018190526000805160206145b7833981519152908201527f7242616c616e63653a2050726f6f662068617320696e636f7272656374206c656064820152630dccee8d60e31b608482015260a401610639565b60006134dc6004856144de565b64ffffffffff1690506135366134f56040850185613ffb565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505060208601358461304f565b6135965760405162461bcd60e51b815260206004820152603e60248201526000805160206145b783398151915260448201527f7242616c616e63653a20496e76616c6964206d65726b6c652070726f6f6600006064820152608401610639565b6135a4836020013585613789565b9150505b9392505050565b60006135a86001600160401b03808416908516614502565b600083516000141580156135e65750602084516135e4919061425e565b155b6136755760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a401610639565b604080516020808201909252848152905b855181116137095761369960028561425e565b6136cc578151600052808601516020526020826040600060026107d05a03fa6136c157600080fd5b6002840493506136f7565b8086015160005281516020526020826040600060026107d05a03fa6136f057600080fd5b6002840493505b6137026020826140dc565b9050613686565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6060611db784846000856137b6565b600080613797600484614552565b6137a2906040614576565b64ffffffffff169050611db784821b613713565b6060824710156138175760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610639565b6001600160a01b0385163b61386e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610639565b600080866001600160a01b0316858760405161388a919061439d565b60006040518083038185875af1925050503d80600081146138c7576040519150601f19603f3d011682016040523d82523d6000602084013e6138cc565b606091505b50915091506138dc8282866138e7565b979650505050505050565b606083156138f65750816135a8565b8251156139065782518084602001fd5b8160405162461bcd60e51b815260040161063991906145a3565b80356001600160401b038116811461393757600080fd5b919050565b60006040828403121561394e57600080fd5b50919050565b60008060006060848603121561396957600080fd5b61397284613920565b925060208401356001600160401b038082111561398e57600080fd5b61399a8783880161393c565b935060408601359150808211156139b057600080fd5b506139bd8682870161393c565b9150509250925092565b60008083601f8401126139d957600080fd5b5081356001600160401b038111156139f057600080fd5b6020830191508360208260051b8501011115613a0b57600080fd5b9250929050565b60008060008060008060008060a0898b031215613a2e57600080fd5b613a3789613920565b975060208901356001600160401b0380821115613a5357600080fd5b613a5f8c838d0161393c565b985060408b0135915080821115613a7557600080fd5b613a818c838d016139c7565b909850965060608b0135915080821115613a9a57600080fd5b613aa68c838d016139c7565b909650945060808b0135915080821115613abf57600080fd5b50613acc8b828c016139c7565b999c989b5096995094979396929594505050565b600060208284031215613af257600080fd5b6135a882613920565b60008083601f840112613b0d57600080fd5b5081356001600160401b03811115613b2457600080fd5b602083019150836020828501011115613a0b57600080fd5b60008060208385031215613b4f57600080fd5b82356001600160401b03811115613b6557600080fd5b613b7185828601613afb565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110613bb157634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d8f8284613b93565b600060208284031215613bd557600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151613c1d6060840182613b93565b5092915050565b801515811461304c57600080fd5b600060208284031215613c4457600080fd5b81356135a881613c24565b600080600080600060608688031215613c6757600080fd5b85356001600160401b0380821115613c7e57600080fd5b613c8a89838a01613afb565b90975095506020880135915080821115613ca357600080fd5b50613cb088828901613afb565b96999598509660400135949350505050565b6001600160a01b038116811461304c57600080fd5b803561393781613cc2565b60008060408385031215613cf557600080fd5b8235613d0081613cc2565b946020939093013593505050565b600060208284031215613d2057600080fd5b81356135a881613cc2565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613d6957613d69613d2b565b604052919050565b60006001600160401b03821115613d8a57613d8a613d2b565b5060051b60200190565b600082601f830112613da557600080fd5b81356020613dba613db583613d71565b613d41565b82815260059290921b84018101918181019086841115613dd957600080fd5b8286015b84811015613df45780358352918301918301613ddd565b509695505050505050565b600080600060608486031215613e1457600080fd5b83356001600160401b0380821115613e2b57600080fd5b818601915086601f830112613e3f57600080fd5b81356020613e4f613db583613d71565b82815260059290921b8401810191818101908a841115613e6e57600080fd5b948201945b83861015613e95578535613e8681613cc2565b82529482019490820190613e73565b97505087013592505080821115613eab57600080fd5b50613eb886828701613d94565b925050613ec760408501613cd7565b90509250925092565b600080600060408486031215613ee557600080fd5b83356001600160401b0380821115613efc57600080fd5b613f088783880161393c565b94506020860135915080821115613f1e57600080fd5b50613f2b868287016139c7565b9497909650939450505050565b600060208284031215613f4a57600080fd5b81516135a881613c24565b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b6000808335601e19843603018112613fc957600080fd5b8301803591506001600160401b03821115613fe357600080fd5b6020019150600581901b3603821315613a0b57600080fd5b6000808335601e1984360301811261401257600080fd5b8301803591506001600160401b0382111561402c57600080fd5b602001915036819003821315613a0b57600080fd5b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156140b157600080fd5b813564ffffffffff811681146135a857600080fd5b634e487b7160e01b600052601160045260246000fd5b600082198211156140ef576140ef6140c6565b500190565b6000600019821415614108576141086140c6565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156141a457818101518382015260200161418c565b838111156141b3576000848401525b50505050565b600081518084526141d1816020860160208601614189565b601f01601f19169290920160200192915050565b6080815260006141f960808301888a614160565b828103602084015261420b81886141b9565b90508281036040840152614220818688614160565b915050826060830152979650505050505050565b602081526000611db7602083018486614160565b634e487b7160e01b600052601260045260246000fd5b60008261426d5761426d614248565b500690565b60008261428157614281614248565b500490565b60006001600160401b03838116908316818110156142a6576142a66140c6565b039392505050565b60008235605e198336030181126142c457600080fd5b9190910192915050565b600062ffffff8216806142e3576142e36140c6565b6000190192915050565b600081600f0b83600f0b600082128260016001607f1b0303821381151615614317576143176140c6565b8260016001607f1b0319038212811615614333576143336140c6565b50019392505050565b60006001600160401b0380831681851680830382111561435e5761435e6140c6565b01949350505050565b6000816000190483118215151615614381576143816140c6565b500290565b600082821015614398576143986140c6565b500390565b600082516142c4818460208701614189565b6000602082840312156143c157600080fd5b5051919050565b8051602080830151919081101561394e5760001960209190910360031b1b16919050565b600083516143fe818460208801614189565b6001600160801b0319939093169190920190815260100192915050565b60008161442a5761442a6140c6565b506000190190565b600081600f0b60016001607f1b0319811415614450576144506140c6565b60000392915050565b60006001600160ff1b038184138284138082168684048611161561447f5761447f6140c6565b600160ff1b600087128281168783058912161561449e5761449e6140c6565b600087129250878205871284841616156144ba576144ba6140c6565b878505871281841616156144d0576144d06140c6565b505050929093029392505050565b600064ffffffffff808416806144f6576144f6614248565b92169190910492915050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561452d5761452d6140c6565b8160016001607f1b03018313811615614548576145486140c6565b5090039392505050565b600064ffffffffff8084168061456a5761456a614248565b92169190910692915050565b600064ffffffffff8083168185168183048111821515161561459a5761459a6140c6565b02949350505050565b6020815260006135a860208301846141b956fe426561636f6e436861696e50726f6f66732e76657269667956616c696461746fa2646970667358221220a2dff12057ce3cc5cbff27578ba648092e3b3e1e3f9e943ccbfd96ffcd9ff2c864736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. @@ -460,37 +460,6 @@ func (_EigenPod *EigenPodCallerSession) EthPOS() (common.Address, error) { return _EigenPod.Contract.EthPOS(&_EigenPod.CallOpts) } -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPod *EigenPodCaller) HasRestaked(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _EigenPod.contract.Call(opts, &out, "hasRestaked") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPod *EigenPodSession) HasRestaked() (bool, error) { - return _EigenPod.Contract.HasRestaked(&_EigenPod.CallOpts) -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPod *EigenPodCallerSession) HasRestaked() (bool, error) { - return _EigenPod.Contract.HasRestaked(&_EigenPod.CallOpts) -} - // LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // // Solidity: function lastCheckpointTimestamp() view returns(uint64) @@ -1742,150 +1711,6 @@ func (_EigenPod *EigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log type return event, nil } -// EigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the EigenPod contract. -type EigenPodRestakingActivatedIterator struct { - Event *EigenPodRestakingActivated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodRestakingActivatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodRestakingActivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodRestakingActivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodRestakingActivated represents a RestakingActivated event raised by the EigenPod contract. -type EigenPodRestakingActivated struct { - PodOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodRestakingActivatedIterator, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _EigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return &EigenPodRestakingActivatedIterator{contract: _EigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil -} - -// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *EigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _EigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodRestakingActivated) - if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPod *EigenPodFilterer) ParseRestakingActivated(log types.Log) (*EigenPodRestakingActivated, error) { - event := new(EigenPodRestakingActivated) - if err := _EigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // EigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPod contract. type EigenPodValidatorBalanceUpdatedIterator struct { Event *EigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index 581fdd9d8..63411adc2 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\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220ea833cf27604c7df5ff5bf6157fb8b26ba635646b57c32d7a29c231f8151507b64736f6c634300080c0033", + Bin: "0x6101206040523480156200001257600080fd5b50604051620030493803806200304983398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e05161010051612e086200024160003960008181610551015281816105fb01528181610b480152818161126c015281816116f001526117e0015260006104dd015260006102cf015260008181610263015281816111eb0152611d64015260006103af0152612e086000f3fe6080604052600436106101b75760003560e01c8063886f1195116100ec578063b13442711161008a578063ea4d3c9b11610064578063ea4d3c9b1461053f578063f2fde38b14610573578063f6848d2414610593578063fabc1cbc146105ce57600080fd5b8063b1344271146104cb578063beffbb89146104ff578063c2c51c401461051f57600080fd5b80639b4e4634116100c65780639b4e46341461044c5780639ba062751461045f578063a38406a314610495578063a6a509be146104b557600080fd5b8063886f1195146103e65780638da5cb5b146104065780639104c3191461042457600080fd5b8063595c6a671161015957806360f4062b1161013357806360f4062b1461035b578063715018a61461038857806374cdd7981461039d57806384d81062146103d157600080fd5b8063595c6a67146102f15780635ac86ab7146103065780635c975abb1461034657600080fd5b80631794bb3c116101955780631794bb3c14610231578063292b7b2b14610251578063387b13001461029d57806339b70e38146102bd57600080fd5b80630e81073c146101bc57806310d67a2f146101ef578063136439dd14610211575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611ffc565b6105ee565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b5061020f61020a366004612028565b61082c565b005b34801561021d57600080fd5b5061020f61022c366004612045565b6108df565b34801561023d57600080fd5b5061020f61024c36600461205e565b610a1e565b34801561025d57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e6565b3480156102a957600080fd5b5061020f6102b836600461205e565b610b3d565b3480156102c957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156102fd57600080fd5b5061020f610edb565b34801561031257600080fd5b5061033661032136600461209f565b606654600160ff9092169190911b9081161490565b60405190151581526020016101e6565b34801561035257600080fd5b506066546101dc565b34801561036757600080fd5b506101dc610376366004612028565b609b6020526000908152604090205481565b34801561039457600080fd5b5061020f610fa2565b3480156103a957600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b3480156103dd57600080fd5b50610285610fb6565b3480156103f257600080fd5b50606554610285906001600160a01b031681565b34801561041257600080fd5b506033546001600160a01b0316610285565b34801561043057600080fd5b5061028573beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b61020f61045a36600461210b565b6110a0565b34801561046b57600080fd5b5061028561047a366004612028565b6098602052600090815260409020546001600160a01b031681565b3480156104a157600080fd5b506102856104b0366004612028565b61118f565b3480156104c157600080fd5b506101dc60995481565b3480156104d757600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561050b57600080fd5b5061020f61051a366004611ffc565b611261565b34801561052b57600080fd5b5061020f61053a366004611ffc565b611478565b34801561054b57600080fd5b506102857f000000000000000000000000000000000000000000000000000000000000000081565b34801561057f57600080fd5b5061020f61058e366004612028565b61187b565b34801561059f57600080fd5b506103366105ae366004612028565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156105da57600080fd5b5061020f6105e9366004612045565b6118f1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106415760405162461bcd60e51b81526004016106389061217f565b60405180910390fd5b6001600160a01b0383166106bd5760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f20616464726573730000000000006064820152608401610638565b600082121561072b5760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b6064820152608401610638565b610739633b9aca00836121f3565b156107ac5760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e740000006064820152608401610638565b6001600160a01b0383166000908152609b6020526040812054906107d0848361221d565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020612d938339815191529061080f9087815260200190565b60405180910390a26108218282611a4d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561087f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a3919061225e565b6001600160a01b0316336001600160a01b0316146108d35760405162461bcd60e51b81526004016106389061227b565b6108dc81611a8f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094b91906122c5565b6109675760405162461bcd60e51b8152600401610638906122e7565b606654818116146109e05760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff1615808015610a3e5750600054600160ff909116105b80610a585750303b158015610a58575060005460ff166001145b610abb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610638565b6000805460ff191660011790558015610ade576000805461ff0019166101001790555b610ae784611b86565b610af18383611bd8565b8015610b37576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b855760405162461bcd60e51b81526004016106389061217f565b6001600160a01b038316610bff5760405162461bcd60e51b81526020600482015260476024820152600080516020612db383398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a401610638565b6001600160a01b038216610c7c5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a401610638565b6000811215610ceb5760405162461bcd60e51b81526020600482015260416024820152600080516020612db383398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a401610638565b610cf9633b9aca00826121f3565b15610d6d5760405162461bcd60e51b815260206004820152604a6024820152600080516020612db383398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a401610638565b6001600160a01b0383166000908152609b602052604081205490811215610e60576000610d998261232f565b905080831115610dfe576001600160a01b0385166000908152609b6020526040812055610dc6818461234c565b9250846001600160a01b0316600080516020612d9383398151915282604051610df191815260200190565b60405180910390a2610e5e565b6001600160a01b0385166000908152609b602052604081208054859290610e2690849061221d565b90915550506040518381526001600160a01b03861690600080516020612d938339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610ebd57600080fd5b505af1158015610ed1573d6000803e3d6000fd5b5050505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4791906122c5565b610f635760405162461bcd60e51b8152600401610638906122e7565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610faa611cc2565b610fb46000611b86565b565b60665460009081906001908116141561100d5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03161561108f5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b6064820152608401610638565b6000611099611d1c565b9250505090565b606654600090600190811614156110f55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610638565b336000908152609860205260409020546001600160a01b03168061111e5761111b611d1c565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e4634903490611154908b908b908b908b908b9060040161238c565b6000604051808303818588803b15801561116d57600080fd5b505af1158015611181573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b03808216600090815260986020526040812054909116806108265761125a836001600160a01b031660001b60405180610940016040528061090e815260200161248561090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261123f9291602001612401565b60405160208183030381529060405280519060200120611e81565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112a95760405162461bcd60e51b81526004016106389061217f565b60008112156113205760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e656761746976650000000000000000006064820152608401610638565b61132e633b9aca00826121f3565b156113a3576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e746064820152608401610638565b6001600160a01b0382166000908152609b60205260408120546113c7908390612416565b905060008112156114585760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a401610638565b6001600160a01b039092166000908152609b602052604090209190915550565b6001600160a01b0380831660009081526098602052604090205483911633146114f35760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b6064820152608401610638565b600260c95414156115465760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610638565b600260c9556001600160a01b0383166115e25760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a401610638565b6115f0633b9aca0083612455565b156116895760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a401610638565b6001600160a01b0383166000908152609b6020526040812054906116ad848361221d565b6001600160a01b0386166000908152609b602052604081208290559091506116d58383611a4d565b9050801561183d5760008112156117a0576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06117348561232f565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561178357600080fd5b505af1158015611797573d6000803e3d6000fd5b5050505061183d565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020612d938339815191528660405161186691815260200190565b60405180910390a25050600160c95550505050565b611883611cc2565b6001600160a01b0381166118e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610638565b6108dc81611b86565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611944573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611968919061225e565b6001600160a01b0316336001600160a01b0316146119985760405162461bcd60e51b81526004016106389061227b565b606654198119606654191614611a165760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610638565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a13565b6000808313611a6d5760008213611a6657506000610826565b5080610826565b60008213611a8557611a7e8361232f565b9050610826565b611a7e8383612416565b6001600160a01b038116611b1d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610638565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6065546001600160a01b0316158015611bf957506001600160a01b03821615155b611c7b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610638565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611cbe82611a8f565b5050565b6033546001600160a01b03163314610fb45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610638565b6000609960008154611d2d90612469565b9091555060408051610940810190915261090e808252600091611dcc91839133916124856020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f1981840301815290829052611db89291602001612401565b604051602081830303815290604052611edd565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b158015611e1057600080fd5b505af1158015611e24573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b166021830152603582018590526055808301859052835180840390910181526075909201909252805191012060009061125a565b60008084471015611f305760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610638565b8251611f7e5760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610638565b8383516020850187f590506001600160a01b038116611fdf5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610638565b949350505050565b6001600160a01b03811681146108dc57600080fd5b6000806040838503121561200f57600080fd5b823561201a81611fe7565b946020939093013593505050565b60006020828403121561203a57600080fd5b813561125a81611fe7565b60006020828403121561205757600080fd5b5035919050565b60008060006060848603121561207357600080fd5b833561207e81611fe7565b9250602084013561208e81611fe7565b929592945050506040919091013590565b6000602082840312156120b157600080fd5b813560ff8116811461125a57600080fd5b60008083601f8401126120d457600080fd5b50813567ffffffffffffffff8111156120ec57600080fd5b60208301915083602082850101111561210457600080fd5b9250929050565b60008060008060006060868803121561212357600080fd5b853567ffffffffffffffff8082111561213b57600080fd5b61214789838a016120c2565b9097509550602088013591508082111561216057600080fd5b5061216d888289016120c2565b96999598509660400135949350505050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082612202576122026121dd565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b038490038513161561223f5761223f612207565b600160ff1b839003841281161561225857612258612207565b50500190565b60006020828403121561227057600080fd5b815161125a81611fe7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156122d757600080fd5b8151801515811461125a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b82141561234557612345612207565b5060000390565b60008282101561235e5761235e612207565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006123a0606083018789612363565b82810360208401526123b3818688612363565b9150508260408301529695505050505050565b6000815160005b818110156123e757602081850181015186830152016123cd565b818111156123f6576000828601525b509290920192915050565b6000611fdf61241083866123c6565b846123c6565b60008083128015600160ff1b85018412161561243457612434612207565b6001600160ff1b038401831381161561244f5761244f612207565b50500390565b600082612464576124646121dd565b500790565b600060001982141561247d5761247d612207565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a26469706673582212203a2f5f808232a89db16cb929df63d010476aca88a5ed2d5b44c6908afd0dcc2264736f6c634300080c0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go index 50fa6d5f4..12f6e44d1 100644 --- a/pkg/bindings/EigenPodStorage/binding.go +++ b/pkg/bindings/EigenPodStorage/binding.go @@ -72,7 +72,7 @@ type IEigenPodValidatorInfo struct { // EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract. var EigenPodStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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}]", } // EigenPodStorageABI is the input ABI used to generate the binding from. @@ -376,37 +376,6 @@ func (_EigenPodStorage *EigenPodStorageCallerSession) EigenPodManager() (common. return _EigenPodStorage.Contract.EigenPodManager(&_EigenPodStorage.CallOpts) } -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPodStorage *EigenPodStorageCaller) HasRestaked(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _EigenPodStorage.contract.Call(opts, &out, "hasRestaked") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPodStorage *EigenPodStorageSession) HasRestaked() (bool, error) { - return _EigenPodStorage.Contract.HasRestaked(&_EigenPodStorage.CallOpts) -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_EigenPodStorage *EigenPodStorageCallerSession) HasRestaked() (bool, error) { - return _EigenPodStorage.Contract.HasRestaked(&_EigenPodStorage.CallOpts) -} - // LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // // Solidity: function lastCheckpointTimestamp() view returns(uint64) @@ -1503,150 +1472,6 @@ func (_EigenPodStorage *EigenPodStorageFilterer) ParseRestakedBeaconChainETHWith return event, nil } -// EigenPodStorageRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the EigenPodStorage contract. -type EigenPodStorageRestakingActivatedIterator struct { - Event *EigenPodStorageRestakingActivated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *EigenPodStorageRestakingActivatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(EigenPodStorageRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(EigenPodStorageRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *EigenPodStorageRestakingActivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *EigenPodStorageRestakingActivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// EigenPodStorageRestakingActivated represents a RestakingActivated event raised by the EigenPodStorage contract. -type EigenPodStorageRestakingActivated struct { - PodOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPodStorage *EigenPodStorageFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*EigenPodStorageRestakingActivatedIterator, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _EigenPodStorage.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return &EigenPodStorageRestakingActivatedIterator{contract: _EigenPodStorage.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil -} - -// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPodStorage *EigenPodStorageFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *EigenPodStorageRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _EigenPodStorage.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(EigenPodStorageRestakingActivated) - if err := _EigenPodStorage.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_EigenPodStorage *EigenPodStorageFilterer) ParseRestakingActivated(log types.Log) (*EigenPodStorageRestakingActivated, error) { - event := new(EigenPodStorageRestakingActivated) - if err := _EigenPodStorage.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // EigenPodStorageValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the EigenPodStorage contract. type EigenPodStorageValidatorBalanceUpdatedIterator struct { Event *EigenPodStorageValidatorBalanceUpdated // Event containing the contract specifics and raw log diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index aefe4e601..8e66ecaa1 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212207b48eb1db81d3714af9f8212d880bfc9c978d91666ce824895935637391fc42664736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212208df93e8cf27ec3b3d7b6c838f1ce7f9cb60cd093f6187dc0eacbfb7f50e9109e64736f6c634300080c0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go index e167c19f7..7d221ad50 100644 --- a/pkg/bindings/IEigenPod/binding.go +++ b/pkg/bindings/IEigenPod/binding.go @@ -72,7 +72,7 @@ type IEigenPodValidatorInfo struct { // IEigenPodMetaData contains all meta data concerning the IEigenPod contract. var IEigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":true,\"internalType\":\"uint40\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int128\",\"internalType\":\"int128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"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\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"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}]", } // IEigenPodABI is the input ABI used to generate the binding from. @@ -376,37 +376,6 @@ func (_IEigenPod *IEigenPodCallerSession) EigenPodManager() (common.Address, err return _IEigenPod.Contract.EigenPodManager(&_IEigenPod.CallOpts) } -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_IEigenPod *IEigenPodCaller) HasRestaked(opts *bind.CallOpts) (bool, error) { - var out []interface{} - err := _IEigenPod.contract.Call(opts, &out, "hasRestaked") - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_IEigenPod *IEigenPodSession) HasRestaked() (bool, error) { - return _IEigenPod.Contract.HasRestaked(&_IEigenPod.CallOpts) -} - -// HasRestaked is a free data retrieval call binding the contract method 0x3106ab53. -// -// Solidity: function hasRestaked() view returns(bool) -func (_IEigenPod *IEigenPodCallerSession) HasRestaked() (bool, error) { - return _IEigenPod.Contract.HasRestaked(&_IEigenPod.CallOpts) -} - // LastCheckpointTimestamp is a free data retrieval call binding the contract method 0xee94d67c. // // Solidity: function lastCheckpointTimestamp() view returns(uint64) @@ -1503,150 +1472,6 @@ func (_IEigenPod *IEigenPodFilterer) ParseRestakedBeaconChainETHWithdrawn(log ty return event, nil } -// IEigenPodRestakingActivatedIterator is returned from FilterRestakingActivated and is used to iterate over the raw logs and unpacked data for RestakingActivated events raised by the IEigenPod contract. -type IEigenPodRestakingActivatedIterator struct { - Event *IEigenPodRestakingActivated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *IEigenPodRestakingActivatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(IEigenPodRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(IEigenPodRestakingActivated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *IEigenPodRestakingActivatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *IEigenPodRestakingActivatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// IEigenPodRestakingActivated represents a RestakingActivated event raised by the IEigenPod contract. -type IEigenPodRestakingActivated struct { - PodOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterRestakingActivated is a free log retrieval operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) FilterRestakingActivated(opts *bind.FilterOpts, podOwner []common.Address) (*IEigenPodRestakingActivatedIterator, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _IEigenPod.contract.FilterLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return &IEigenPodRestakingActivatedIterator{contract: _IEigenPod.contract, event: "RestakingActivated", logs: logs, sub: sub}, nil -} - -// WatchRestakingActivated is a free log subscription operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) WatchRestakingActivated(opts *bind.WatchOpts, sink chan<- *IEigenPodRestakingActivated, podOwner []common.Address) (event.Subscription, error) { - - var podOwnerRule []interface{} - for _, podOwnerItem := range podOwner { - podOwnerRule = append(podOwnerRule, podOwnerItem) - } - - logs, sub, err := _IEigenPod.contract.WatchLogs(opts, "RestakingActivated", podOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(IEigenPodRestakingActivated) - if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseRestakingActivated is a log parse operation binding the contract event 0xca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd. -// -// Solidity: event RestakingActivated(address indexed podOwner) -func (_IEigenPod *IEigenPodFilterer) ParseRestakingActivated(log types.Log) (*IEigenPodRestakingActivated, error) { - event := new(IEigenPodRestakingActivated) - if err := _IEigenPod.contract.UnpackLog(event, "RestakingActivated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // IEigenPodValidatorBalanceUpdatedIterator is returned from FilterValidatorBalanceUpdated and is used to iterate over the raw logs and unpacked data for ValidatorBalanceUpdated events raised by the IEigenPod contract. type IEigenPodValidatorBalanceUpdatedIterator struct { Event *IEigenPodValidatorBalanceUpdated // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 5d6ee0bf0..7d1204d15 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -77,7 +77,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212200602ebe9d3368cfa5a06d45f76ac318319b189d6d4d072a05b19a32790e3257764736f6c634300080c0033", + Bin: "0x6101806040523480156200001257600080fd5b5060405162003f3838038062003f388339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613af1620004476000396000611919015260008181610459015261239d0152600061071b01526000818161036201526121cc0152600081816102d60152612278015260008181610432015261217b01526000818161067a0152611ef201526000818161062001528181611fa901526120840152613af16000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063715018a611610167578063c46db606116100ce578063f2fde38b11610087578063f2fde38b1461073d578063f698da2514610750578063f8cd844814610758578063fabc1cbc1461076b578063fbf1e2c11461077e578063fce36c7d1461079157600080fd5b8063c46db6061461069c578063d4540a55146106ca578063de02e503146106dd578063e221b245146106f0578063e810ce2114610703578063ea4d3c9b1461071657600080fd5b80639104c319116101205780639104c319146105c85780639be3d4e4146105e35780639d45c2811461061b578063a0169ddd14610642578063bb7e451f14610655578063bf21a8aa1461067557600080fd5b8063715018a6146105565780637b8f8b051461055e578063863cb9a914610566578063865c695314610579578063886f1195146105a45780638da5cb5b146105b757600080fd5b806337838ed01161020b57806358baaa3e116101c457806358baaa3e146104cf578063595c6a67146104e25780635ac86ab7146104ea5780635c975abb1461050d5780635e9d8348146105155780636d21117e1461052857600080fd5b806337838ed01461042d57806339b70e38146104545780633a8c07861461047b5780633ccc861d146104925780633efe1db6146104a55780634d18cc35146104b857600080fd5b8063131433b41161025d578063131433b41461035d578063136439dd14610384578063149bc8721461039757806322f19a64146103b85780632b9f64a4146103d957806336af41fa1461041a57600080fd5b806218572c1461029957806304a0c502146102d1578063092db0071461030d5780630eb383451461033557806310d67a2f1461034a575b600080fd5b6102bc6102a7366004613205565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102c8565b60cb5461032290600160e01b900461ffff1681565b60405161ffff90911681526020016102c8565b610348610343366004613230565b6107a4565b005b610348610358366004613205565b610826565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610392366004613269565b6108e2565b6103aa6103a536600461329a565b610a21565b6040519081526020016102c8565b6103226103c63660046132b6565b505060cb54600160e01b900461ffff1690565b6104026103e7366004613205565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102c8565b6103486104283660046132e4565b610a97565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b60cb546102f890600160a01b900463ffffffff1681565b6103486104a036600461336c565b610cd1565b6103486104b33660046133cc565b611086565b60cb546102f890600160c01b900463ffffffff1681565b6103486104dd3660046133f8565b611386565b610348611397565b6102bc6104f8366004613413565b606654600160ff9092169190911b9081161490565b6066546103aa565b6102bc610523366004613436565b61145e565b6102bc61053636600461346b565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103486114dc565b60ca546103aa565b610348610574366004613205565b6114f0565b6103aa6105873660046132b6565b60cd60209081526000928352604080842090915290825290205481565b606554610402906001600160a01b031681565b6033546001600160a01b0316610402565b61040273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6105eb611501565b604080518251815260208084015163ffffffff9081169183019190915292820151909216908201526060016102c8565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b610348610650366004613205565b611589565b6103aa610663366004613205565b60ce6020526000908152604090205481565b6102f87f000000000000000000000000000000000000000000000000000000000000000081565b6102bc6106aa36600461346b565b60d060209081526000928352604080842090915290825290205460ff1681565b6103486106d83660046134b4565b6115e8565b6105eb6106eb366004613269565b611730565b6103486106fe366004613527565b6117ac565b6102f8610711366004613269565b6117bd565b6104027f000000000000000000000000000000000000000000000000000000000000000081565b61034861074b366004613205565b61189f565b6103aa611915565b6103aa61076636600461329a565b611953565b610348610779366004613269565b611964565b60cb54610402906001600160a01b031681565b61034861079f3660046132e4565b611ac0565b6107ac611c3f565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190613542565b6001600160a01b0316336001600160a01b0316146108d65760405162461bcd60e51b81526004016108cd9061355f565b60405180910390fd5b6108df81611c99565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561092a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094e91906135a9565b61096a5760405162461bcd60e51b81526004016108cd906135c6565b606654818116146109e35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610a316020840184613205565b8360200135604051602001610a7a9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610ac05760405162461bcd60e51b81526004016108cd9061360e565b33600090815260d1602052604090205460ff16610b5f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016108cd565b60026097541415610b825760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110610ba557610ba561367c565b9050602002810190610bb79190613692565b33600081815260ce60209081526040808320549051949550939192610be292909185918791016137d7565b604051602081830303815290604052805190602001209050610c0383611d90565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610c3690839061381d565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610c7e908890613835565b60405180910390a4610cb0333060408601803590610c9f9060208901613205565b6001600160a01b0316929190612568565b5050508080610cbe90613848565b915050610b8a565b505060016097555050565b60665460029060049081161415610cfa5760405162461bcd60e51b81526004016108cd9061360e565b60026097541415610d1d5760405162461bcd60e51b81526004016108cd90613645565b6002609755600060ca610d3360208601866133f8565b63ffffffff1681548110610d4957610d4961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091529050610d9b84826125d9565b6000610dad6080860160608701613205565b6001600160a01b03808216600090815260cc60205260409020549192501680610dd35750805b336001600160a01b03821614610e515760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016108cd565b60005b610e6160a0880188613863565b90508110156110785736610e7860e08901896138b4565b83818110610e8857610e8861367c565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ebd90850185613205565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905080826020013511610f775760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016108cd565b6000610f878260208501356138fe565b6001600160a01b038716600090815260cd60209081526040822092935085018035929190610fb59087613205565b6001600160a01b0316815260208082019290925260400160002091909155610ff7908a908390610fe790870187613205565b6001600160a01b03169190612882565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061103b6020890189613205565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050808061107090613848565b915050610e54565b505060016097555050505050565b606654600390600890811614156110af5760405162461bcd60e51b81526004016108cd9061360e565b60cb546001600160a01b031633146111265760405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b60648201526084016108cd565b60cb5463ffffffff600160c01b9091048116908316116111c25760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016108cd565b428263ffffffff161061125b5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016108cd565b60ca5460cb5460009061127b90600160a01b900463ffffffff1642613915565b6040805160608101825287815263ffffffff878116602080840182815286841685870181815260ca805460018101825560009190915296517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029098029788015591517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee29096018054925196861667ffffffffffffffff19909316929092176401000000009686169690960295909517905560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61138e611c3f565b6108df816128b2565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156113df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140391906135a9565b61141f5760405162461bcd60e51b81526004016108cd906135c6565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006114d48260ca61147360208301836133f8565b63ffffffff16815481106114895761148961367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff808216948401949094526401000000009004909216918101919091526125d9565b506001919050565b6114e4611c3f565b6114ee6000612923565b565b6114f8611c3f565b6108df81612975565b604080516060810182526000808252602082018190529181019190915260ca805461152e906001906138fe565b8154811061153e5761153e61367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff80821694840194909452640100000000900490921691810191909152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff16158080156116085750600054600160ff909116105b806116225750303b158015611622575060005460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108cd565b6000805460ff1916600117905580156116a8576000805461ff0019166101001790555b6116b06129d1565b60c9556116bd8686612a68565b6116c687612923565b6116cf84612975565b6116d8836128b2565b6116e182612b52565b8015611727576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b604080516060810182526000808252602082018190529181019190915260ca82815481106117605761176061367c565b6000918252602091829020604080516060810182526002909302909101805483526001015463ffffffff8082169484019490945264010000000090049092169181019190915292915050565b6117b4611c3f565b6108df81612b52565b60ca546000905b63ffffffff811615611830578260ca6117de60018461393d565b63ffffffff16815481106117f4576117f461367c565b906000526020600020906002020160000154141561181e5761181760018261393d565b9392505050565b8061182881613962565b9150506117c4565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016108cd565b6118a7611c3f565b6001600160a01b03811661190c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108cd565b6108df81612923565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611946575060c95490565b61194e6129d1565b905090565b60006001610a316020840184613205565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db9190613542565b6001600160a01b0316336001600160a01b031614611a0b5760405162461bcd60e51b81526004016108cd9061355f565b606654198119606654191614611a895760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016108cd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610a16565b60665460009060019081161415611ae95760405162461bcd60e51b81526004016108cd9061360e565b60026097541415611b0c5760405162461bcd60e51b81526004016108cd90613645565b600260975560005b82811015610cc65736848483818110611b2f57611b2f61367c565b9050602002810190611b419190613692565b33600081815260ce60209081526040808320549051949550939192611b6c92909185918791016137d7565b604051602081830303815290604052805190602001209050611b8d83611d90565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611bc090839061381d565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611c08908890613835565b60405180910390a4611c29333060408601803590610c9f9060208901613205565b5050508080611c3790613848565b915050611b14565b6033546001600160a01b031633146114ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108cd565b6001600160a01b038116611d275760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016108cd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6000611d9c82806138b4565b905011611e01576040805162461bcd60e51b8152602060048201526024810191909152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016108cd565b6000816040013511611e735760405162461bcd60e51b81526020600482015260416024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016108cd565b6f4b3b4ca85a86c47a098a223fffffffff81604001351115611eeb5760405162461bcd60e51b815260206004820152603f6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016108cd565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016611f2260a08301608084016133f8565b63ffffffff161115611fa75760405162461bcd60e51b81526020600482015260546024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016108cd565b7f0000000000000000000000000000000000000000000000000000000000000000611fd860a08301608084016133f8565b611fe29190613998565b63ffffffff16156120825760405162461bcd60e51b815260206004820152606a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016108cd565b7f00000000000000000000000000000000000000000000000000000000000000006120b360808301606084016133f8565b6120bd9190613998565b63ffffffff16156121635760405162461bcd60e51b81526020600482015260706024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016108cd565b61217360808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff16426121ab91906138fe565b111580156121f457506121c460808201606083016133f8565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b61226e5760405162461bcd60e51b81526020600482015260516024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016108cd565b61229e63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164261381d565b6122ae60808301606084016133f8565b63ffffffff1611156123325760405162461bcd60e51b81526020600482015260536024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016108cd565b6000805b61234083806138b4565b905081101561256357600061235584806138b4565b838181106123655761236561367c565b61237b9260206040909202019081019150613205565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa1580156123e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240a91906135a9565b8061243157506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6124a45760405162461bcd60e51b815260206004820152604a6024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016108cd565b806001600160a01b0316836001600160a01b0316106125515760405162461bcd60e51b81526020600482015260696024820152600080516020613a9c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016108cd565b915061255c81613848565b9050612336565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526125d39085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612bbd565b50505050565b806040015163ffffffff164210156126525760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a206044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016108cd565b61265f60c0830183613863565b905061266e60a0840184613863565b9050146126f85760405162461bcd60e51b815260206004820152604c60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016108cd565b61270560e08301836138b4565b905061271460c0840184613863565b90501461279c5760405162461bcd60e51b815260206004820152604a60248201527f52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2060448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016108cd565b80516127c8906127b260408501602086016133f8565b6127bf60408601866139bb565b86606001612c8f565b60005b6127d860a0840184613863565b90508110156125635761287260808401356127f660a0860186613863565b848181106128065761280661367c565b905060200201602081019061281b91906133f8565b61282860c0870187613863565b858181106128385761283861367c565b905060200281019061284a91906139bb565b61285760e08901896138b4565b878181106128675761286761367c565b905060400201612e03565b61287b81613848565b90506127cb565b6040516001600160a01b03831660248201526044810182905261256390849063a9059cbb60e01b9060640161259c565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612a8957506001600160a01b03821615155b612b0b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016108cd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612b4e82611c99565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612c12826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f549092919063ffffffff16565b8051909150156125635780806020019051810190612c3091906135a9565b6125635760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108cd565b612c9a602083613a02565b6001901b8463ffffffff1610612d245760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016108cd565b6000612d2f82610a21565b9050612d7a84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016108cd565b505050505050565b612e0e602083613a02565b6001901b8463ffffffff1610612e8c5760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016108cd565b6000612e9782611953565b9050612ee284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916612f6b565b612dfb5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016108cd565b6060612f638484600085612f83565b949350505050565b600083612f798685856130b4565b1495945050505050565b606082471015612fe45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108cd565b6001600160a01b0385163b61303b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108cd565b600080866001600160a01b031685876040516130579190613a42565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506130a98282866131b7565b979650505050505050565b6000602084516130c49190613a54565b1561314b5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016108cd565b8260205b855181116131ae57613162600285613a54565b6131835781600052808601516020526040600020915060028404935061319c565b8086015160005281602052604060002091506002840493505b6131a760208261381d565b905061314f565b50949350505050565b606083156131c6575081611817565b8251156131d65782518084602001fd5b8160405162461bcd60e51b81526004016108cd9190613a68565b6001600160a01b03811681146108df57600080fd5b60006020828403121561321757600080fd5b8135611817816131f0565b80151581146108df57600080fd5b6000806040838503121561324357600080fd5b823561324e816131f0565b9150602083013561325e81613222565b809150509250929050565b60006020828403121561327b57600080fd5b5035919050565b60006040828403121561329457600080fd5b50919050565b6000604082840312156132ac57600080fd5b6118178383613282565b600080604083850312156132c957600080fd5b82356132d4816131f0565b9150602083013561325e816131f0565b600080602083850312156132f757600080fd5b823567ffffffffffffffff8082111561330f57600080fd5b818501915085601f83011261332357600080fd5b81358181111561333257600080fd5b8660208260051b850101111561334757600080fd5b60209290920196919550909350505050565b6000610100828403121561329457600080fd5b6000806040838503121561337f57600080fd5b823567ffffffffffffffff81111561339657600080fd5b6133a285828601613359565b925050602083013561325e816131f0565b803563ffffffff811681146133c757600080fd5b919050565b600080604083850312156133df57600080fd5b823591506133ef602084016133b3565b90509250929050565b60006020828403121561340a57600080fd5b611817826133b3565b60006020828403121561342557600080fd5b813560ff8116811461181757600080fd5b60006020828403121561344857600080fd5b813567ffffffffffffffff81111561345f57600080fd5b612f6384828501613359565b6000806040838503121561347e57600080fd5b8235613489816131f0565b946020939093013593505050565b80356133c7816131f0565b803561ffff811681146133c757600080fd5b60008060008060008060c087890312156134cd57600080fd5b86356134d8816131f0565b955060208701356134e8816131f0565b94506040870135935060608701356134ff816131f0565b925061350d608088016133b3565b915061351b60a088016134a2565b90509295509295509295565b60006020828403121561353957600080fd5b611817826134a2565b60006020828403121561355457600080fd5b8151611817816131f0565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156135bb57600080fd5b815161181781613222565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235609e198336030181126136a857600080fd5b9190910192915050565b818352600060208085019450826000805b868110156137175782356136d6816131f0565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146136ff578384fd5b898601525060409788019792909201916001016136c3565b50959695505050505050565b60008135601e1983360301811261373957600080fd5b8201803567ffffffffffffffff81111561375257600080fd5b8060061b360384131561376457600080fd5b60a0855261377960a0860182602085016136b2565b91505061378860208401613497565b6001600160a01b03166020850152604083810135908501526137ac606084016133b3565b63ffffffff1660608501526137c3608084016133b3565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006137fe6060830184613723565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561383057613830613807565b500190565b6020815260006118176020830184613723565b600060001982141561385c5761385c613807565b5060010190565b6000808335601e1984360301811261387a57600080fd5b83018035915067ffffffffffffffff82111561389557600080fd5b6020019150600581901b36038213156138ad57600080fd5b9250929050565b6000808335601e198436030181126138cb57600080fd5b83018035915067ffffffffffffffff8211156138e657600080fd5b6020019150600681901b36038213156138ad57600080fd5b60008282101561391057613910613807565b500390565b600063ffffffff80831681851680830382111561393457613934613807565b01949350505050565b600063ffffffff8381169083168181101561395a5761395a613807565b039392505050565b600063ffffffff82168061397857613978613807565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806139af576139af613982565b92169190910692915050565b6000808335601e198436030181126139d257600080fd5b83018035915067ffffffffffffffff8211156139ed57600080fd5b6020019150368190038213156138ad57600080fd5b600082613a1157613a11613982565b500490565b60005b83811015613a31578181015183820152602001613a19565b838111156125d35750506000910152565b600082516136a8818460208701613a16565b600082613a6357613a63613982565b500690565b6020815260008251806020840152613a87816040850160208701613a16565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220e52fb26157463315694ed5ac72f19573eb8b1c5d8a10ac01200fa5fd3e36d8ca64736f6c634300080c0033", } // RewardsCoordinatorABI 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 94dcf009e..8ea94c9e0 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122037c61feb73331dde2cef2090aa6cfafa473b8ed63df2bad4f00b472458477ae764736f6c634300080c0033", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212206e1ccf0b567fe0a333f6216baa74ddf8f29abb9dceda7725410045a1c074bf9664736f6c634300080c0033", } // 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 492789ada..b958f2017 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\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220962ff7eef57b5c1bfe43a15b53cf7f7c88cdae4a4583a8b11b19665abd083a2264736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122046d173d1ef1bfdab81e0242c1cbbfa589313f188df1fda23da63eefa3c40d8e064736f6c634300080c0033", } // StrategyBaseTVLLimitsABI 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 5fce56dd6..42ea7c1b9 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\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220712e469c606f8283e2342dc341dc69f9dfb160cd6d17e154bae4836370b00dc864736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220561c810248f8f59167c28fa7df64dc3aacd0abb4f9fdc63d86b1d567b060d54764736f6c634300080c0033", } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/script/deploy/mainnet/M2Deploy.s.sol b/script/deploy/mainnet/M2Deploy.s.sol index adba3e565..4a6c0daa3 100644 --- a/script/deploy/mainnet/M2Deploy.s.sol +++ b/script/deploy/mainnet/M2Deploy.s.sol @@ -307,39 +307,15 @@ contract M2Deploy is Script, Test { ); require(eigenPodManager.hasPod(eigenPodDepositor) == hasPod, "eigenPodManager.hasPod incorrect"); require(eigenPod.podOwner() == eigenPodOwner, "eigenPod.podOwner incorrect"); - require(!eigenPod.hasRestaked(), "eigenPod.hasRestaked incorrect"); // Unpause eigenpods verify credentials uint256 paused = IPausable(address(eigenPodManager)).paused(); cheats.prank(IPauserRegistry(IPausable(address(eigenPodManager)).pauserRegistry()).unpauser()); IPausable(address(eigenPodManager)).unpause(paused ^ (1 << 2)); // eigenpods verify credentials on 2nd bit - // Activate restaking and expect emit cheats.prank(eigenPodOwner); - cheats.expectEmit(true, true, true, true); - emit RestakingActivated(eigenPodOwner); eigenPod.startCheckpoint(false); - - // Check updated storage values - require(eigenPod.hasRestaked(), "eigenPod.hasRestaked not set to true"); } - - // Existing LST depositor – ensure that strategy length and shares are all identical - // Existing LST depositor – ensure that an existing queued withdrawal remains queued - // Check from stored root, and recalculate root and make sure it matches - // Check that completing the withdrawal results in the same behavior (same transfer of ERC20 tokens) - // Check that staker nonce & numWithdrawalsQueued remains the same as before the upgrade - // Existing LST depositor – queuing a withdrawal before/after the upgrade has the same effects (same decrease in shares, resultant withdrawal root) - // Existing EigenPod owner – EigenPodManager.ownerToPod remains the same - // Existing EigenPod owner – EigenPodManager.hasPod remains the same - // Existing EigenPod owner – EigenPod.podOwner remains the same - // Existing EigenPod owner – EigenPod.hasRestaked remains false - // Can call EigenPod.activateRestaking and it correctly: - // Sends all funds in EigenPod (need to make sure it has nonzero balance beforehand) - // Sets `hasRestaked` to ‘true’ - // Emits a ‘RestakingActivated’ event - // EigenPod: ethPOS, eigenPodManager - event RestakingActivated(address indexed podOwner); } interface IDelegationManagerV0 { diff --git a/src/contracts/interfaces/IEigenPod.sol b/src/contracts/interfaces/IEigenPod.sol index 52922d9a3..bae6ca0b3 100644 --- a/src/contracts/interfaces/IEigenPod.sol +++ b/src/contracts/interfaces/IEigenPod.sol @@ -59,9 +59,6 @@ interface IEigenPod { /// @notice Emitted when restaked beacon chain ETH is withdrawn from the eigenPod. event RestakedBeaconChainETHWithdrawn(address indexed recipient, uint256 amount); - /// @notice Emitted when podOwner enables restaking - event RestakingActivated(address indexed podOwner); - /// @notice Emitted when ETH is received via the `receive` fallback event NonBeaconChainETHReceived(uint256 amountReceived); @@ -130,7 +127,7 @@ interface IEigenPod { * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and * future checkpoint proofs will need to include them. - * @dev Withdrawal credential proofs MUST NOT be older than the `lastCheckpointTimestamp` OR `currentCheckpointTimestamp`. + * @dev Withdrawal credential proofs MUST NOT be older than `currentCheckpointTimestamp`. * @dev Validators proven via this method MUST NOT have an exit epoch set already. * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. @@ -202,9 +199,6 @@ interface IEigenPod { /// @notice The owner of this EigenPod function podOwner() external view returns (address); - /// @notice TODO - function hasRestaked() external view returns (bool); - /// @notice Returns the validatorInfo struct for the provided pubkeyHash function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory); diff --git a/src/contracts/pods/EigenPod.sol b/src/contracts/pods/EigenPod.sol index 08b387050..465826e90 100644 --- a/src/contracts/pods/EigenPod.sol +++ b/src/contracts/pods/EigenPod.sol @@ -107,11 +107,6 @@ contract EigenPod is function initialize(address _podOwner) external initializer { require(_podOwner != address(0), "EigenPod.initialize: podOwner cannot be zero address"); podOwner = _podOwner; - - /// Pods deployed prior to the M2 release have this variable set to `false`, as before M2, pod owners - /// did not need to engage with the proof system and were able to withdraw ETH from their pod on demand. - hasRestaked = true; - emit RestakingActivated(podOwner); } /******************************************************************************* @@ -141,14 +136,6 @@ contract EigenPod is onlyWhenNotPaused(PAUSED_START_CHECKPOINT) { _startCheckpoint(revertIfNoBalance); - - /// Legacy support for pods deployed pre-M2 that never activated restaking. `startCheckpoint` - /// can activate restaking, allowing them to continue using their pods via the checkpoint - /// system. - if (!hasRestaked) { - hasRestaked = true; - emit RestakingActivated(podOwner); - } } /** @@ -233,7 +220,7 @@ contract EigenPod is * @dev Verify one or more validators have their withdrawal credentials pointed at this EigenPod, and award * shares based on their effective balance. Proven validators are marked `ACTIVE` within the EigenPod, and * future checkpoint proofs will need to include them. - * @dev Withdrawal credential proofs MUST NOT be older than the `lastCheckpointTimestamp` OR `currentCheckpointTimestamp`. + * @dev Withdrawal credential proofs MUST NOT be older than `currentCheckpointTimestamp`. * @dev Validators proven via this method MUST NOT have an exit epoch set already. * @param beaconTimestamp the beacon chain timestamp sent to the 4788 oracle contract. Corresponds * to the parent beacon block root against which the proof is verified. @@ -254,25 +241,17 @@ contract EigenPod is onlyEigenPodOwner onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) { - require(hasRestaked, "EigenPod.verifyWithdrawalCredentials: restaking not active"); - require( (validatorIndices.length == validatorFieldsProofs.length) && (validatorFieldsProofs.length == validatorFields.length), "EigenPod.verifyWithdrawalCredentials: validatorIndices and proofs must be same length" ); - // Prevents two edge cases: - // 1. Calling this method using a `beaconTimestamp` <= `currentCheckpointTimestamp` would allow - // a newly-verified validator to be submitted to `verifyCheckpointProofs`, making progress - // on an existing checkpoint. - // 2. Calling this method using a `beaconTimestamp` <= `current/lastCheckpointTimestamp` might allow - // a newly-verified validator to already be exited and included in the previous checkpoint's - // native ETH balance (`podBalanceGwei`). This would result in shares being awarded for the - // validator twice. As an additional safety mechanism, `_verifyWithdrawalCredentials` also - // requires that the validator being proven has not initiated an exit. + // Calling this method using a `beaconTimestamp` <= `currentCheckpointTimestamp` would allow + // a newly-verified validator to be submitted to `verifyCheckpointProofs`, making progress + // on an existing checkpoint. require( - beaconTimestamp > lastCheckpointTimestamp && beaconTimestamp > currentCheckpointTimestamp, + beaconTimestamp > currentCheckpointTimestamp, "EigenPod.verifyWithdrawalCredentials: specified timestamp is too far in past" ); @@ -459,7 +438,9 @@ contract EigenPod is "EigenPod._verifyWithdrawalCredentials: validator must be inactive to prove withdrawal credentials" ); - // Validator should not already be in the process of exiting. + // Validator should not already be in the process of exiting. This is an important property + // this method needs to enforce to ensure a validator cannot be already-exited by the time + // its withdrawal credentials are verified. // // Note that when a validator initiates an exit, two values are set: // - exit_epoch @@ -503,7 +484,10 @@ contract EigenPod is validatorIndex: validatorIndex }); - // Account for validator in future checkpoints + // Account for validator in future checkpoints. Note that if this pod has never started a + // checkpoint before, `lastCheckpointedAt` will be zero here. This is fine because the main + // purpose of `lastCheckpointedAt` is to enforce that newly-verified validators are not + // eligible to progress already-existing checkpoints - however in this case, no checkpoints exist. activeValidatorCount++; uint64 lastCheckpointedAt = currentCheckpointTimestamp == 0 ? lastCheckpointTimestamp : currentCheckpointTimestamp; diff --git a/src/contracts/pods/EigenPodStorage.sol b/src/contracts/pods/EigenPodStorage.sol index 6430e64ab..9e4e3a931 100644 --- a/src/contracts/pods/EigenPodStorage.sol +++ b/src/contracts/pods/EigenPodStorage.sol @@ -14,8 +14,8 @@ abstract contract EigenPodStorage is IEigenPod { /// @notice the amount of execution layer ETH in this contract that is staked in EigenLayer (i.e. withdrawn from the Beacon Chain but not from EigenLayer), uint64 public withdrawableRestakedExecutionLayerGwei; - /// @notice TODO - bool public hasRestaked; + /// @notice DEPRECATED: previously used to track whether a pod had activated restaking + bool internal __deprecated_hasRestaked; /// @notice DEPRECATED: previously tracked withdrawals proven per validator mapping(bytes32 => mapping(uint64 => bool)) internal __deprecated_provenWithdrawal; diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index aaa16fd31..104364459 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -92,15 +92,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, EIGENPOD Helpers *******************************************************************************/ - /// @notice Post-M2, all new deployed eigen pods will have restaked set to true - modifier hasNotRestaked() { - // Write hasRestaked as false. hasRestaked in slot 52 - bytes32 slot = bytes32(uint256(52)); - bytes32 value = bytes32(0); // 0 == false - cheats.store(address(eigenPod), slot, value); - _; - } - modifier timewarp() { uint curState = timeMachine.warpToLast(); _; @@ -114,13 +105,6 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, (result, data) = address(eigenPod).call{value: ethAmount}(""); } - function _setPodHasNotRestaked(EigenPodUser staker) internal { - // Write hasRestaked as false. hasRestaked in slot 52 - bytes32 slot = bytes32(uint256(52)); - bytes32 value = bytes32(0); // 0 == false - cheats.store(address(staker.pod()), slot, value); - } - function _newEigenPodStaker(uint256 rand) internal returns (EigenPodUser, uint256) { string memory stakerName; @@ -321,13 +305,20 @@ contract EigenPodUnitTests is EigenLayerUnitTestSetup, EigenPodPausingConstants, contract EigenPodUnitTests_Initialization is EigenPodUnitTests { + function test_constructor() public { + EigenPod pod = new EigenPod(ethPOSDepositMock, eigenPodManagerMock, GENESIS_TIME_LOCAL); + + assertTrue(pod.ethPOS() == ethPOSDepositMock, "should have set ethPOS correctly"); + assertTrue(pod.eigenPodManager() == eigenPodManagerMock, "should have set eigenpodmanager correctly"); + assertTrue(pod.GENESIS_TIME() == GENESIS_TIME_LOCAL, "should have set genesis time correctly"); + } + function test_initialization() public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: 0 }); EigenPod pod = staker.pod(); // Check podOwner and restaked assertEq(pod.podOwner(), address(staker), "Pod owner incorrectly set"); - assertTrue(pod.hasRestaked(), "hasRestaked incorrectly set"); // Check immutable storage assertEq(address(pod.ethPOS()), address(ethPOSDepositMock), "EthPOS incorrectly set"); assertEq(address(pod.eigenPodManager()), address(eigenPodManagerMock), "EigenPodManager incorrectly set"); @@ -341,24 +332,6 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests { cheats.expectRevert("Initializable: contract is already initialized"); pod.initialize(address(this)); } - - function test_initialize_eventEmitted() public { - address newPodOwner = address(0x123); - - // Deploy new pod - EigenPod newEigenPod = EigenPod(payable( - Create2.deploy( - 0, - bytes32(uint256(uint160(newPodOwner))), - // set the beacon address to the eigenPodBeacon - abi.encodePacked(beaconProxyBytecode, abi.encode(eigenPodBeacon, "")) - ))); - - // Expect emit and Initialize new pod - vm.expectEmit(true, true, true, true); - emit RestakingActivated(newPodOwner); - newEigenPod.initialize(newPodOwner); - } } contract EigenPodUnitTests_EPMFunctions is EigenPodUnitTests { @@ -635,13 +608,19 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro staker.verifyWithdrawalCredentials(validators); } - /// @notice beaconTimestamp must be after latest checkpoint + /// @notice beaconTimestamp must be after the current checkpoint function testFuzz_revert_beaconTimestampInvalid(uint256 rand) public { cheats.warp(10 days); (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); + // Ensure we have more than one validator (_newEigenPodStaker allocates a nonzero amt of eth) + cheats.deal(address(staker), address(staker).balance + 32 ether); (uint40[] memory validators,) = staker.startValidators(); - // Start and auto-complete a checkpoint, setting `lastCheckpointTimestamp` to the current block + uint40[] memory firstValidator = new uint40[](1); + firstValidator[0] = validators[0]; + staker.verifyWithdrawalCredentials(firstValidator); + + // Start a checkpoint so `currentCheckpointTimestamp` is nonzero staker.startCheckpoint(); // Try to verify withdrawal credentials at the current block @@ -649,16 +628,6 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro staker.verifyWithdrawalCredentials(validators); } - /// @notice if an eigenPod has not migrated and set hasRestaked to true, verify wc should revert - function testFuzz_revert_restakingNotEnabled(uint256 rand) public { - (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); - _setPodHasNotRestaked(staker); - (uint40[] memory validators,) = staker.startValidators(); - - cheats.expectRevert("EigenPod.verifyWithdrawalCredentials: restaking not active"); - staker.verifyWithdrawalCredentials(validators); - } - /// @notice Check for revert on input array mismatch lengths function testFuzz_revert_inputArrayLengthsMismatch(uint256 rand) public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); @@ -1011,29 +980,6 @@ contract EigenPodUnitTests_startCheckpoint is EigenPodUnitTests { check_StartCheckpoint_State(staker); assertEq(pod.currentCheckpoint().proofsRemaining, uint24(validators.length), "should have one proof remaining pre verified validator"); } - - /// @notice fuzz test an eigenpod with multiple validators who hasn't enabled restaking yet - function testFuzz_startCheckpoint_hasRestakedFalse(uint256 rand) public { - (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); - _setPodHasNotRestaked(staker); - - staker.startValidators(); - beaconChain.advanceEpoch(); - - assertFalse( - staker.pod().hasRestaked(), - "hasRestaked should be false" - ); - cheats.expectEmit(true, true, true, true, address(staker.pod())); - emit CheckpointCreated(uint64(block.timestamp), EIP_4788_ORACLE.timestampToBlockRoot(block.timestamp)); - cheats.expectEmit(true, true, true, true, address(staker.pod())); - emit RestakingActivated(address(staker)); - staker.startCheckpoint(); - assertTrue( - staker.pod().hasRestaked(), - "hasRestaked should be true" - ); - } } contract EigenPodUnitTests_verifyCheckpointProofs is EigenPodUnitTests { From 01be04b95b9c455599e72cafa237984409f1c129 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 26 Jun 2024 15:38:41 +0000 Subject: [PATCH 36/85] test: add tests for constructor and initialize --- src/test/integration/mocks/BeaconChainMock.t.sol | 15 +++++++++++++-- src/test/unit/EigenPodUnit.t.sol | 13 +++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 74b3c6641..5572a8ef3 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -450,10 +450,12 @@ contract BeaconChainMock is PrintUtils { if (validatorIndex % 4 == 0) { uint64 dummyBalanceGwei = type(uint64).max - uint64(validators.length); + bytes memory pubkey = new bytes(48); + assembly { mstore(add(48, pubkey), validatorIndex) } validators.push(Validator({ isDummy: true, isSlashed: false, - pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), + pubkeyHash: sha256(abi.encodePacked(pubkey, bytes16(0))), withdrawalCreds: "", effectiveBalanceGwei: dummyBalanceGwei, exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH @@ -463,10 +465,13 @@ contract BeaconChainMock is PrintUtils { validatorIndex++; } + // Use pubkey format from `EigenPod._calculateValidatorPubkeyHash` + bytes memory pubkey = new bytes(48); + assembly { mstore(add(48, pubkey), validatorIndex) } validators.push(Validator({ isDummy: false, isSlashed: false, - pubkeyHash: keccak256(abi.encodePacked(validatorIndex)), + pubkeyHash: sha256(abi.encodePacked(pubkey, bytes16(0))), withdrawalCreds: withdrawalCreds, effectiveBalanceGwei: balanceGwei, exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH @@ -976,6 +981,12 @@ contract BeaconChainMock is PrintUtils { return validators[validatorIndex].pubkeyHash; } + function pubkey(uint40 validatorIndex) public view returns (bytes memory) { + bytes memory pubkey = new bytes(48); + assembly { mstore(add(48, pubkey), validatorIndex) } + return pubkey; + } + function getPubkeyHashes(uint40[] memory _validators) public view returns (bytes32[] memory) { bytes32[] memory pubkeyHashes = new bytes32[](_validators.length); diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index 104364459..f78b36080 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -332,6 +332,15 @@ contract EigenPodUnitTests_Initialization is EigenPodUnitTests { cheats.expectRevert("Initializable: contract is already initialized"); pod.initialize(address(this)); } + + function test_initialize_revert_emptyPodOwner() public { + EigenPod pod = new EigenPod(ethPOSDepositMock, eigenPodManagerMock, GENESIS_TIME_LOCAL); + // un-initialize pod + cheats.store(address(pod), 0, 0); + + cheats.expectRevert("EigenPod.initialize: podOwner cannot be zero address"); + pod.initialize(address(0)); + } } contract EigenPodUnitTests_EPMFunctions is EigenPodUnitTests { @@ -883,8 +892,12 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro // Check ValidatorInfo values for each validator for (uint i = 0; i < validators.length; i++) { bytes32 pubkeyHash = beaconChain.pubkeyHash(validators[i]); + bytes memory pubkey = beaconChain.pubkey(validators[i]); IEigenPod.ValidatorInfo memory info = pod.validatorPubkeyHashToInfo(pubkeyHash); + IEigenPod.ValidatorInfo memory pkInfo = pod.validatorPubkeyToInfo(pubkey); + assertTrue(pod.validatorStatus(pubkey) == IEigenPod.VALIDATOR_STATUS.ACTIVE, "validator status should be active"); + assertEq(keccak256(abi.encode(info)), keccak256(abi.encode(pkInfo)), "validator info should be identical"); assertEq(info.validatorIndex, validators[i], "should have assigned correct validator index"); assertEq(info.restakedBalanceGwei, beaconChain.effectiveBalance(validators[i]), "should have restaked full effective balance"); assertEq(info.lastCheckpointedAt, pod.lastCheckpointTimestamp(), "should have recorded correct update time"); From a9502e43bddd0f00f597004810b4fb59a207d5f6 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 26 Jun 2024 16:56:30 +0000 Subject: [PATCH 37/85] test: fix mainnet fork tests and compiler warnings --- .../Deploy_Preprod_RewardsCoordinator.s.sol | 2 +- .../Deploy_Test_RewardsCoordinator.s.sol | 2 +- .../EigenPod_Checkpoint_Deploy_Preprod.s.sol | 2 +- .../deploy/holesky/Eigen_Token_Deploy.s.sol | 2 +- .../holesky/M2_Deploy_From_Scratch.s.sol | 2 +- script/deploy/holesky/M2_Deploy_Preprod.s.sol | 2 +- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 4 +- script/utils/ExistingDeploymentParser.sol | 3 +- src/test/integration/IntegrationBase.t.sol | 9 +-- .../integration/IntegrationDeployer.t.sol | 64 +++++++++---------- .../integration/mocks/BeaconChainMock.t.sol | 20 +++--- .../VerifyWC_StartCP_CompleteCP.t.sol | 32 +++++++++- src/test/integration/users/User.t.sol | 5 +- src/test/unit/AVSDirectoryUnit.t.sol | 4 -- src/test/unit/DelegationUnit.t.sol | 3 +- src/test/unit/EigenPodUnit.t.sol | 10 +-- src/test/unit/RewardsCoordinatorUnit.t.sol | 9 +-- 17 files changed, 94 insertions(+), 81 deletions(-) diff --git a/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol b/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol index 2c4eaad65..c534efea1 100644 --- a/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol +++ b/script/deploy/holesky/Deploy_Preprod_RewardsCoordinator.s.sol @@ -45,7 +45,7 @@ contract Deploy_Preprod_RewardsCoordinator is Deploy_Test_RewardsCoordinator { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); logAndOutputContractAddresses("script/output/holesky/Deploy_RewardsCoordinator_Preprod.holesky.config.json"); diff --git a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol index 74fce373b..d7776b454 100644 --- a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol +++ b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol @@ -32,7 +32,7 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); logAndOutputContractAddresses("script/output/holesky/Deploy_RewardsCoordinator.holesky.config.json"); diff --git a/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol b/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol index 130812492..319ca3c6e 100644 --- a/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol +++ b/script/deploy/holesky/EigenPod_Checkpoint_Deploy_Preprod.s.sol @@ -35,7 +35,7 @@ contract EigenPod_Checkpoint_Deploy_Preprod is ExistingDeploymentParser { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); logAndOutputContractAddresses("script/output/holesky/EigenPod_Checkpoint_Deploy_Preprod.output.json"); diff --git a/script/deploy/holesky/Eigen_Token_Deploy.s.sol b/script/deploy/holesky/Eigen_Token_Deploy.s.sol index 6ce776682..bd130a034 100644 --- a/script/deploy/holesky/Eigen_Token_Deploy.s.sol +++ b/script/deploy/holesky/Eigen_Token_Deploy.s.sol @@ -96,7 +96,7 @@ contract Eigen_Token_Deploy is Script, Test { tokenProxyAdmin.transferOwnership(operationsMultisig); } - function _verifyDeployment() internal { + function _verifyDeployment() internal view { require(EIGEN.totalSupply() == TOTAL_SUPPLY, "Eigen_Token_Deploy: total supply mismatch"); require(bEIGEN.totalSupply() == TOTAL_SUPPLY, "Eigen_Token_Deploy: total supply mismatch"); diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index 169713531..1e7e371ea 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -26,7 +26,7 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); logAndOutputContractAddresses("script/output/holesky/M2_deploy_from_scratch.holesky.config.json"); diff --git a/script/deploy/holesky/M2_Deploy_Preprod.s.sol b/script/deploy/holesky/M2_Deploy_Preprod.s.sol index d58059955..8dde5dde7 100644 --- a/script/deploy/holesky/M2_Deploy_Preprod.s.sol +++ b/script/deploy/holesky/M2_Deploy_Preprod.s.sol @@ -42,7 +42,7 @@ contract M2_Deploy_Holesky_Preprod is M2_Deploy_Holesky_From_Scratch { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); // override to check contract.owner() is EOAowner instead logAndOutputContractAddresses("script/output/holesky/M2_deploy_preprod.holesky.config.json"); diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index 13a53bf5c..c69bbe108 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -34,7 +34,7 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { // Sanity Checks _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); logAndOutputContractAddresses("script/output/mainnet/M2_mainnet_upgrade.output.json"); @@ -278,7 +278,7 @@ contract Queue_M2_Upgrade is M2_Mainnet_Upgrade, TimelockEncoding { // Check correctness after upgrade _verifyContractPointers(); _verifyImplementations(); - _verifyContractsInitialized({isInitialDeployment: true}); + _verifyContractsInitialized(); _verifyInitializationParams(); _postUpgradeChecks(); } diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 8498da43e..79c47e78d 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -436,9 +436,8 @@ contract ExistingDeploymentParser is Script, Test { /** * @notice Verify initialization of Transparent Upgradeable Proxies. Also check * initialization params if this is the first deployment. - * @param isInitialDeployment True if this is the first deployment of contracts from scratch */ - function _verifyContractsInitialized(bool isInitialDeployment) internal virtual { + function _verifyContractsInitialized() internal virtual { // AVSDirectory vm.expectRevert(bytes("Initializable: contract is already initialized")); avsDirectory.initialize(address(0), eigenLayerPauserReg, AVS_DIRECTORY_INIT_PAUSED_STATUS); diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 18e88bede..dc232a98c 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -115,7 +115,9 @@ abstract contract IntegrationBase is IntegrationDeployer { uint totalSent = (gweiSent * GWEI_TO_WEI) + remainderSent; cheats.deal(address(this), address(this).balance + totalSent); - destination.call{ value: totalSent }(""); + bool r; + bytes memory d; + (r, d) = destination.call{ value: totalSent }(""); return (gweiSent, remainderSent); } @@ -130,11 +132,6 @@ abstract contract IntegrationBase is IntegrationDeployer { emit log("===Migrating Stakers/Operators==="); - // Enable restaking for stakers' pods - for (uint i = 0; i < stakersToMigrate.length; i++) { - stakersToMigrate[i].startCheckpoint(); - } - // Register operators with DelegationManager for (uint i = 0; i < operatorsToMigrate.length; i++) { operatorsToMigrate[i].registerAsOperator(); diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index fd5822eb5..7e52549f1 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -637,38 +637,38 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { 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.eigenPodManager(), - 0 - ); - // Create time machine and mock beacon chain - timeMachine = new TimeMachine(); - beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET); - - cheats.startPrank(executorMultisig); - eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); - cheats.stopPrank(); + // // 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.eigenPodManager(), + // 0 + // ); + // // Create time machine and mock beacon chain + // timeMachine = new TimeMachine(); + // beaconChain = new BeaconChainMock(eigenPodManager, GENESIS_TIME_MAINNET); + + // cheats.startPrank(executorMultisig); + // eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); + // cheats.stopPrank(); } else { revert("_deployOrFetchContracts: unimplemented forkType"); diff --git a/src/test/integration/mocks/BeaconChainMock.t.sol b/src/test/integration/mocks/BeaconChainMock.t.sol index 5572a8ef3..419c19a97 100644 --- a/src/test/integration/mocks/BeaconChainMock.t.sol +++ b/src/test/integration/mocks/BeaconChainMock.t.sol @@ -450,12 +450,12 @@ contract BeaconChainMock is PrintUtils { if (validatorIndex % 4 == 0) { uint64 dummyBalanceGwei = type(uint64).max - uint64(validators.length); - bytes memory pubkey = new bytes(48); - assembly { mstore(add(48, pubkey), validatorIndex) } + bytes memory _dummyPubkey = new bytes(48); + assembly { mstore(add(48, _dummyPubkey), validatorIndex) } validators.push(Validator({ isDummy: true, isSlashed: false, - pubkeyHash: sha256(abi.encodePacked(pubkey, bytes16(0))), + pubkeyHash: sha256(abi.encodePacked(_dummyPubkey, bytes16(0))), withdrawalCreds: "", effectiveBalanceGwei: dummyBalanceGwei, exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH @@ -466,12 +466,12 @@ contract BeaconChainMock is PrintUtils { } // Use pubkey format from `EigenPod._calculateValidatorPubkeyHash` - bytes memory pubkey = new bytes(48); - assembly { mstore(add(48, pubkey), validatorIndex) } + bytes memory _pubkey = new bytes(48); + assembly { mstore(add(48, _pubkey), validatorIndex) } validators.push(Validator({ isDummy: false, isSlashed: false, - pubkeyHash: sha256(abi.encodePacked(pubkey, bytes16(0))), + pubkeyHash: sha256(abi.encodePacked(_pubkey, bytes16(0))), withdrawalCreds: withdrawalCreds, effectiveBalanceGwei: balanceGwei, exitEpoch: BeaconChainProofs.FAR_FUTURE_EPOCH @@ -981,10 +981,10 @@ contract BeaconChainMock is PrintUtils { return validators[validatorIndex].pubkeyHash; } - function pubkey(uint40 validatorIndex) public view returns (bytes memory) { - bytes memory pubkey = new bytes(48); - assembly { mstore(add(48, pubkey), validatorIndex) } - return pubkey; + function pubkey(uint40 validatorIndex) public pure returns (bytes memory) { + bytes memory _pubkey = new bytes(48); + assembly { mstore(add(48, _pubkey), validatorIndex) } + return _pubkey; } function getPubkeyHashes(uint40[] memory _validators) public view returns (bytes32[] memory) { 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 c569974bd..fd641bab2 100644 --- a/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol +++ b/src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol @@ -18,12 +18,13 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { function test_GasMetering() public r(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); cheats.pauseGasMetering(); - (uint40[] memory validators, uint beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, ) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); EigenPod pod = staker.pod(); @@ -82,6 +83,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -101,6 +103,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => This should fail function test_VerifyWC_VerifyWC_Fails(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -118,6 +121,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => This should fail function test_VerifyWC_StartCP_StartCP_Fails(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -139,6 +143,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => this should fail function test_VerifyWC_StartCP_CompleteCP_StartCP_Fails(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -163,6 +168,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_Advance_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -187,6 +193,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_Advance_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -214,6 +221,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => This should fail function test_ExitValidators_VerifyWC_Fails(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, ) = staker.startValidators(); staker.exitValidators(validators); @@ -230,6 +238,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_ExitValidators_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -260,6 +269,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => exited balance should be reflected in 4 and 5 function test_VerifyWC_StartCP_ExitValidators_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -295,8 +305,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => this should fail function test_SlashToPod_VerifyWC_Fails(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); - (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); + (uint40[] memory validators, ) = staker.startValidators(); beaconChain.slashValidators(validators); // Advance epoch, withdrawing slashed validators to pod beaconChain.advanceEpoch_NoRewards(); @@ -312,6 +323,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares should decrease by slashed amount function test_VerifyWC_SlashToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -342,6 +354,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => slashed balance should be reflected in 4 and 5 function test_VerifyWC_StartCP_SlashToPod_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -377,6 +390,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares should decrease by slashed amount function test_VerifyWC_SlashToPod_VerifyStale_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -402,6 +416,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares should decrease by slashed amount function test_VerifyWC_SlashToCL_VerifyStale_CompleteCP_SlashAgain(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -442,6 +457,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => slashed balance should be reflected in 4 and 5 function test_VerifyWC_StartCP_SlashToPod_CompleteCP_VerifyStale(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch without generating rewards @@ -478,6 +494,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares increase by rewards earned on beacon chain function test_EarnOnBeacon_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch and generate consensus rewards, but don't withdraw to pod @@ -501,6 +518,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares increase by rewards earned on beacon chain function test_VerifyWC_EarnOnBeacon_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -526,6 +544,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_EarnOnBeacon_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -555,6 +574,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares increase by rewards withdrawn to pod function test_EarnToPod_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); // Advance epoch, generating consensus rewards and withdrawing anything over 32 ETH @@ -578,6 +598,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares increase by rewards withdrawn to pod function test_VerifyWC_EarnToPod_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -603,6 +624,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_EarnToPod_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -635,8 +657,9 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => checkpoint should auto-complete, awarding shares for ETH in pod function test_NativeETH_StartCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); // Send a random amount of ETH to staker's fallback - (uint64 gweiSent, uint remainderSent) = _sendRandomETH(address(staker.pod())); + (uint64 gweiSent, ) = _sendRandomETH(address(staker.pod())); // Move forward an epoch so we generate a state root that can be queried in startCheckpoint beaconChain.advanceEpoch(); @@ -653,6 +676,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares should account for native ETH function test_NativeETH_VerifyWC_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -680,6 +704,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => after 3, shares should account for native ETH function test_VerifyWC_NativeETH_StartCP_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); @@ -707,6 +732,7 @@ contract Integration_VerifyWC_StartCP_CompleteCP is IntegrationCheckUtils { /// => no change in shares between 1 and 3 function test_VerifyWC_StartCP_NativeETH_CompleteCP(uint24 _rand) public r(_rand) { (User staker, ,) = _newRandomStaker(); + _upgradeEigenLayerContracts(); (uint40[] memory validators, uint64 beaconBalanceGwei) = staker.startValidators(); beaconChain.advanceEpoch_NoRewards(); diff --git a/src/test/integration/users/User.t.sol b/src/test/integration/users/User.t.sol index 5ab045151..7875e56c6 100644 --- a/src/test/integration/users/User.t.sol +++ b/src/test/integration/users/User.t.sol @@ -316,7 +316,6 @@ contract User is PrintUtils { for (uint i = 0; i < tokens.length; i++) { IStrategy strat = withdrawal.strategies[i]; - uint shares = withdrawal.shares[i]; if (strat == BEACONCHAIN_ETH_STRAT) { tokens[i] = NATIVE_ETH; @@ -326,7 +325,7 @@ contract User is PrintUtils { if (receiveAsTokens) { _log("- exiting all validators and completing checkpoint"); - uint64 exitedBalanceGwei = _exitValidators(getActiveValidators()); + _exitValidators(getActiveValidators()); beaconChain.advanceEpoch_NoRewards(); @@ -454,7 +453,7 @@ contract User is PrintUtils { } /// @dev Revert, passing through an error message - function _revert(bytes memory err) internal { + function _revert(bytes memory err) internal pure { if (err.length != 0) { assembly { revert(add(32, err), mload(err)) } } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 92fd7f875..6fd70891f 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -321,10 +321,6 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni assertFalse(delegationManager.isOperator(operator), "bad test setup"); _registerOperatorWithBaseDetails(operator); - uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); - cheats.startPrank(operator); avsDirectory.cancelSalt(salt); diff --git a/src/test/unit/DelegationUnit.t.sol b/src/test/unit/DelegationUnit.t.sol index 1c71723fa..79bf46daf 100644 --- a/src/test/unit/DelegationUnit.t.sol +++ b/src/test/unit/DelegationUnit.t.sol @@ -3114,7 +3114,6 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage */ function test_Revert_WhenWithdrawalDelayBlocksNotPassed( uint256[] memory depositAmounts, - uint256 randSalt, bool receiveAsTokens ) public { cheats.assume(depositAmounts.length > 0 && depositAmounts.length <= 32); @@ -3168,7 +3167,7 @@ contract DelegationManagerUnitTests_completeQueuedWithdrawal is DelegationManage ( IDelegationManager.Withdrawal memory withdrawal, IERC20[] memory tokens, - bytes32 withdrawalRoot + // bytes32 withdrawalRoot ) = _setUpCompleteQueuedWithdrawalBeaconStrat({ staker: defaultStaker, withdrawer: defaultStaker, diff --git a/src/test/unit/EigenPodUnit.t.sol b/src/test/unit/EigenPodUnit.t.sol index f78b36080..93ef22938 100644 --- a/src/test/unit/EigenPodUnit.t.sol +++ b/src/test/unit/EigenPodUnit.t.sol @@ -732,7 +732,7 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro ); staker.verifyWithdrawalCredentials(validators); - uint64 exitedBalanceGwei = staker.exitValidators(validators); + staker.exitValidators(validators); beaconChain.advanceEpoch_NoRewards(); staker.startCheckpoint(); @@ -787,7 +787,7 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro } /// @notice modify validator field length to cause a revert - function testFuzz_revert_invalidValidatorFields(uint256 rand, bytes32 randPubkeyIndex) public { + function testFuzz_revert_invalidValidatorFields(uint256 rand) public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); (uint40[] memory validators, ) = staker.startValidators(); EigenPod pod = staker.pod(); @@ -813,7 +813,7 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro } /// @notice modify validator proof length to cause a revert - function testFuzz_revert_invalidValidatorProofLength(uint256 rand, bytes32 randPubkeyIndex) public { + function testFuzz_revert_invalidValidatorProofLength(uint256 rand) public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); (uint40[] memory validators, ) = staker.startValidators(); EigenPod pod = staker.pod(); @@ -861,7 +861,7 @@ contract EigenPodUnitTests_verifyWithdrawalCredentials is EigenPodUnitTests, Pro function testFuzz_verifyWithdrawalCredentials(uint256 rand) public { (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); EigenPod pod = staker.pod(); - (uint40[] memory validators, uint256 beaconBalanceWei) = staker.startValidators(); + (uint40[] memory validators, ) = staker.startValidators(); // Complete a quick empty checkpoint so we have a nonzero value for `lastCheckpointedAt` staker.startCheckpoint(); beaconChain.advanceEpoch_NoRewards(); @@ -1210,7 +1210,7 @@ contract EigenPodUnitTests_verifyCheckpointProofs is EigenPodUnitTests { } /// @notice test that verifyCheckpointProofs skips duplicate checkpoint proofs - function testFuzz_verifyCheckpointProofs_skipIfAlreadyProven(uint256 rand, bool epochRewards) public { + function testFuzz_verifyCheckpointProofs_skipIfAlreadyProven(uint256 rand) public { // Setup verifyCheckpointProofs (EigenPodUser staker,) = _newEigenPodStaker({ rand: rand }); // Ensure we have more than one validator (_newEigenPodStaker allocates a nonzero amt of eth) diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 1c8369967..8f42a9328 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -1706,8 +1706,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with earnerIndex and tokenIndex set to max value and using alternate claim proofs function testFuzz_processClaim_WhenMaxEarnerIndexAndTokenIndex( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // Hardcode earner address to earner in alternate claim proofs earner = 0x25A1B7322f9796B26a4Bec125913b34C292B28D6; @@ -1775,8 +1774,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with single token leaf for the earner's subtree. tokenTreeProof for the token in the claim should be empty function testFuzz_processClaim_WhenSingleTokenLeaf( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // if setClaimerFor is true, set the earners claimer to the fuzzed address address claimer; @@ -1838,8 +1836,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with single earner leaf in the merkle tree. earnerTreeProof in claim should be empty function testFuzz_processClaim_WhenSingleEarnerLeaf( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // Hardcode earner address to earner in alternate claim proofs earner = 0x0D6bA28b9919CfCDb6b233469Cc5Ce30b979e08E; From d148952a2942a97a218a2ab70f9b9f1792796081 Mon Sep 17 00:00:00 2001 From: wadealexc Date: Wed, 26 Jun 2024 18:24:51 +0000 Subject: [PATCH 38/85] docs: update diagrams for pepe --- docs/README.md | 10 +++++----- .../EL_completing_queued_withdrawal.png | Bin 64111 -> 0 bytes docs/images/EL_delegating.png | Bin 46920 -> 0 bytes docs/images/EL_depositing.png | Bin 65455 -> 0 bytes docs/images/EL_depositing_BeaconChainETH.png | Bin 40071 -> 0 bytes .../images/EL_depositing_BeaconChainETH_2.png | Bin 69580 -> 0 bytes docs/images/EL_eigenpods_architecture.png | Bin 46623 -> 0 bytes docs/images/EL_operator_registration.png | Bin 48248 -> 0 bytes docs/images/EL_queuing_a_withdrawal.png | Bin 52566 -> 0 bytes docs/images/EigenPods_Architecture.png | Bin 42555 -> 0 bytes .../Complete Withdrawal as Shares.png | Bin 68315 -> 46756 bytes .../Complete Withdrawal as Tokens.png | Bin 193954 -> 113409 bytes .../Staker Flow Diagrams/Delegating.png | Bin 61308 -> 41741 bytes .../Staker Flow Diagrams/Depositing.png | Bin 219382 -> 135514 bytes .../Partial Withdrawals.png | Bin 101971 -> 0 bytes .../Staker Flow Diagrams/Queue Withdrawal.png | Bin 71050 -> 47414 bytes .../Staker Flow Diagrams/Validator Exits.png | Bin 88354 -> 64387 bytes .../Staker Flow Diagrams/Validator Yield.png | Bin 0 -> 65369 bytes docs/images/Withdrawal_Credential_Proof.png | Bin 41481 -> 0 bytes docs/images/Withdrawal_Proof.png | Bin 83903 -> 0 bytes docs/images/Withdrawal_Proof_Diagram.png | Bin 2661557 -> 0 bytes docs/images/middleware_outline_doc.png | Bin 479322 -> 0 bytes docs/images/operator_deregister.png | Bin 387078 -> 0 bytes docs/images/operator_opting.png | Bin 390735 -> 0 bytes docs/images/samplemerkle.png | Bin 18663 -> 0 bytes docs/images/slashing.png | Bin 280358 -> 0 bytes docs/images/staker_opting.png | Bin 384035 -> 0 bytes docs/images/staker_withdrawing.png | Bin 515446 -> 0 bytes docs/images/staterootproof.png | Bin 28999 -> 0 bytes docs/images/three_middlewares.png | Bin 19891 -> 0 bytes .../three_middlewares_withdrawal_queued.png | Bin 24661 -> 0 bytes docs/images/withdrawal.png | Bin 33323 -> 0 bytes 32 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 docs/images/EL_completing_queued_withdrawal.png delete mode 100644 docs/images/EL_delegating.png delete mode 100644 docs/images/EL_depositing.png delete mode 100644 docs/images/EL_depositing_BeaconChainETH.png delete mode 100644 docs/images/EL_depositing_BeaconChainETH_2.png delete mode 100644 docs/images/EL_eigenpods_architecture.png delete mode 100644 docs/images/EL_operator_registration.png delete mode 100644 docs/images/EL_queuing_a_withdrawal.png delete mode 100644 docs/images/EigenPods_Architecture.png delete mode 100644 docs/images/Staker Flow Diagrams/Partial Withdrawals.png create mode 100644 docs/images/Staker Flow Diagrams/Validator Yield.png delete mode 100644 docs/images/Withdrawal_Credential_Proof.png delete mode 100644 docs/images/Withdrawal_Proof.png delete mode 100644 docs/images/Withdrawal_Proof_Diagram.png delete mode 100644 docs/images/middleware_outline_doc.png delete mode 100644 docs/images/operator_deregister.png delete mode 100644 docs/images/operator_opting.png delete mode 100644 docs/images/samplemerkle.png delete mode 100644 docs/images/slashing.png delete mode 100644 docs/images/staker_opting.png delete mode 100644 docs/images/staker_withdrawing.png delete mode 100644 docs/images/staterootproof.png delete mode 100644 docs/images/three_middlewares.png delete mode 100644 docs/images/three_middlewares_withdrawal_queued.png delete mode 100644 docs/images/withdrawal.png diff --git a/docs/README.md b/docs/README.md index e5bfdcb7f..c025fe88c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -164,18 +164,18 @@ This flow is mostly useful if a Staker wants to change which Operator they are d Completing a queued withdrawal as tokens is roughly the same for both native ETH and LSTs. -However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the "Withdrawal Processing" diagrams below. +However, note that *before* a withdrawal can be completed, native ETH stakers will need to perform additional steps, detailed in the diagrams below. ![.](./images/Staker%20Flow%20Diagrams/Complete%20Withdrawal%20as%20Tokens.png) -##### Withdrawal Processing: Validator Exits +##### `EigenPods`: Processing Validator Exits If a Staker wants to fully withdraw from the beacon chain, they need to perform these additional steps before their withdrawal is completable: ![.](./images/Staker%20Flow%20Diagrams/Validator%20Exits.png) -##### Withdrawal Processing: Partial Beacon Chain Withdrawals +##### `EigenPods`: Processing Validator Yield -If a Staker wants to withdraw consensus rewards from the beacon chain, they do NOT go through the `DelegationManager`. This is the only withdrawal type that is not initiated in the `DelegationManager`: +As the Staker's `EigenPod` accumulates consensus layer or execution layer yield, the `EigenPod's` balance will increase. The Staker can Checkpoint their validator to claim this yield as shares, which can either remain staked in EigenLayer or be withdrawn via the `DelegationManager` withdrawal queue: -![.](./images/Staker%20Flow%20Diagrams/Partial%20Withdrawals.png) \ No newline at end of file +![.](./images/Staker%20Flow%20Diagrams/Validator%20Yield.png) \ No newline at end of file diff --git a/docs/images/EL_completing_queued_withdrawal.png b/docs/images/EL_completing_queued_withdrawal.png deleted file mode 100644 index 9dd09ddb51a1262dde53ffa273bfb81535ac8caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64111 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 diff --git a/docs/images/EL_delegating.png b/docs/images/EL_delegating.png deleted file mode 100644 index f371009f447fc12fcb5d19bc701688cd8e8adbf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46920 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°jn4N60c|l-foF768(y;(ScI_*mvW2 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 diff --git a/docs/images/EL_depositing.png b/docs/images/EL_depositing.png deleted file mode 100644 index 9e732e15dd20d6e1a77ed16290bfad18086e445d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65455 zcmc$Gbx_pZ`!=z{g2XPMfOLb@B1lL#NQVMSrzl7$(y?@df`pXPn3M?8-5}i!B8bvm z@A<&^Gw;mKh`9UNbMAA;bzj$g4AWFsB*edgkAZHJ_bz z@JSCIfnM_mxHTEyTSFv&<}1~=jP;R*&wB8%L!GKQ@oTHy8Iry=9HD;j|9VNG;e&B-4uq{d6BZ-=zg`HqQeZyg zf4$caP8RPcrzGvfc?*fa{P!yiG4x-5M zgyBl_r#3k$*uP)QGP=0`{yX>?|E?5c_S^Dn$^X3xKe^CVurDcTJOVn2Nr|IhS+&h$ zrM5axCdxk9S8cYGjX(ZyO+c+8dhK+7=9^ZQ!dNiX(?^QbPI4_HdEPuDE1bdm-D#pD zJ)-MkDZol!9cHG9#5U^8mF|BUKv}d9{GO@xJvd`YG&Co?A&|dY>3rH8M#?rmT4bS9 zUH0(X)3V_QPsSRFCGB{tHvDNE>oCif5+3FrJ!PQvSWa_YOL+LS=$f8kpU2KGtx)!B zAz-QLz`ToiAB{P&7-LmUM~qy*vSoM`KM>2y@cC}^V$4e3s?AC#ox;&`z4{xC*G9dd zbyw2HkWGg7@ZXAM+KFeq;`TA(d+-bv@kBMToRc+KVsXpkwGxfChMONgn(O4M7Rg^X z$j&d0*R@V2IcR6gfGwnLbn@1Y&PVX3yBI$$pTqGy{`2imypDR&*AZjU-|IFHYa!`4>OqPuaxN zdZjNWwLb0dyncWBw)XzR=i+XmnaOC;zvZ!K^#QmOws~pR6{f^!?)_w z?zj|JuGdtqPAs%UmDrb!FdOhwhF-728QGt!MkTu4 z#s9&Z`wtN>c6wYZov)bN){9ZI5JMKLcQZ`L;veu`EF}94;C=EsWOqa1x;U8ofvDe| z{V{HJ4}TO{v~FysxlY@LP&+Fb__epZ<&GfGiwmd?73umOMMi`ct*t^WujzF6A+XzGTdZ zRY6X|`!b%FHZ?I6QuMJIL^O8-S*$v_zZnj>mZ&|j#fguiZVwl}_%m)WQ{zoODjL5hVtlsUD>?C6&)C+@q~>7$>V$a& zxBv2=Hl~=54@eRUx^Df^yGz2r)ye4l>A}}x{vKhb!4z^6FTSSQq5BUFdeg;aPm?9Q zJ@TJyWZZsoe*<1b{baH2CAvAo_smw$#QUq6AMnrLWoyNq!2&vEz!{CBP6Ite3IQ;1$?n|jUzb5wW8KeXkUBvpXzU!2W{nldp)$D+;=M+qv z)l8v;(*dRp!r{1k+U2N*gE?22x|lFs&F@AyDvmv+Ty( z!j#$CiFyz-+89vZ;}flFRaTEf#ca*39B7Im}?NX6kDMnBeSiB(sMcu0itn&KS9+@a5Ah+L=0fv z>-N^VMU zFKTCl+0mSomOSzvR>?@$UNi+CW7SoQ-QkB0U**Y-1l;IQ*+_y^)<9ea+eY{P{`BnS z$scUS)`?>}{tV&dfv2}lb||-`18}Yc;4&c^L)YiIg?E0)erVECV{D4DpKhk5fL~ntGs!#0Gj`a{aANaKJIF8jq%ARc}k1FDC z6D9dUsU9oeu!*nt2fZ)Gc>D8rzrz=U0m^wQyvhv#5eHs2lA$V`QW3|)S~Ypex&qtW zj|EAA=&S1|lk@AvuViC>I>^X_668}t!G-6yGtN(JMm_zVf|bH>BDv=qOkHH7Gq@@@ z2zSKJLDj(REAHf}TvQEgiei{IRT$E^!pO@-heoy#Wp-iXRQCS7&nDxB8;QVjopfr& z3c)Ch46QPEJLGG8$~7Ecw)!56ErXC+7?q0A?0g-o7HGWOlNQj{VCrfX zj*QvtbfzabDD8C`f6bdHjd8dpl6NhOWL<8gxLS3BzU_+Mb)o*I-fU&qQx! z8zS2WH}m1rYh(jjtsIq4#96W2L1}!YSLIOwFj1=11LQn^5WzIXL!Z0XgBgOQ1?Xuv zqEQxMFTs~M#1$Wz8eT z;FPrls_<2u6yAYDP?8%t6kyh_3;WurCsA|8acqI>3oH!*^Svd^&51+IVX<%e6AFeG z`pgVo@m4!$MJ9WjL^su>TEvJ8R?Pu?$DI6emBb zb9}*+kt4UZ-kt+Dv(+4Q+{dOM5?w1SYz;$@Gf=E>ek#>IplaysoEV70^%rBo+kP~i znP*`}Z-ZZYMNA+N_`X2D@gvC-?i-Ip-EfTp3+ciHW$WBpEhq?qzq)PYmnU{NLspK0 zZwebI1Qlj;&n{J-?o9;bp>E1-ym!{eav??bl5p*rGu*X(<|fq^l87{x-9i$&$?$&v zm3fmmA_7sRpL)i&uGsQEPg0j1z%+brH>-!R)o`gB$c8PF1TlmJz>cVcW1pba{y!zZ zd1Uls)V=!ZB5$P=5UBs%a9l{s5$60-wT0DtG)-nbkHqX!EfH&s8Ql#z6bTgjzE#DhkISAHGw@SX= z`E_1}H;Kb$n3M@St4l~E&iZL*PY}GGe=c$6WkNZ8Zjp1(UM`VX-oRAOqFj$n2GyTr zYqOU~_}9+yr}r9R9injq0Giu5+&cFbPAOh~Omuy@(mPK$=MZ>sd`MOD8_qg<#5&_v zF}Op`raOmermW@i%^tv!ztRUk?*^8KcHa+_+wU!m0)Kz5{;G0yOax+FAYITw zr-tk*U+65`!8`oHj9<$7eJ7hf(@aQh=78u|TBR^%neehl@hBv_2G;E`gcwQJ*;br^ zs^r&>{m{ZaF%JUvc$6vGo^`DI_+MK&Kl=UUgP7t_7{X*Z?|66)KwE_=%D)L z6Fls1#s>C{%-w;g#ks~1Tqe;B#-@G6ibVPwiJnP@fwT9vS>gueO|*Z`m?bl}>gZfo zWnYvHq*odXRi6kgiJ-Nd^^{SfQu(RGIiJ>kCBdd8QTvegmPrrgQe6`UEsq?5|3k)X zu~yX5O;=zY=T>b85=^9$G<_Vr9>X-33KKo&H`lU7AelZQbho4w)1rSwkLfg@_z}AA!d%j7^Cth40cm$;8BV2X)Nis+YNI_{7!5 z=kH;@Y;~?UaQ^V?*<@P7%eJQnMPw}+X!C($+~JYR(07yVif@)tp(1Ia2qD!mJ+uv% z$1gumnM|vMf^a=oIfpVR9Rpk%%TG!te)CPQcfs}A5?z!>hKg8J#YUi;QFEoV=vGcd zU-t-)%+H=Qsw!JI_(H3h;!HpYDPIOLQszb#x8nXA$1PfwW>f0@z&dUZ0^#$#r-xx4 zCo={ODIRcQtm8CcLrnC7XCJeSHUZotI}=YSQ1|&J=Qg9J8y1fYMb#;ch9LOY8{e}Q zTOB*8y}A}dAur)M{4cl)1k-o~TGsx_NLCPVt^^PEd<)m`7yN7tGV5_3V(}N-h5vj; zU|FN$p>NR}Dc<0(Q-Kh#!O7S$BfBNq%X;6J*VpF0u(IL7ii#I`7Oe%Ytnh$1gDt^n zK0`-8;xD$elKi?tfqLLUB#L@e&yUT&b7b_<8s@NDmT6p65yck+i6_0mu9Cw7XR5k} zv4VepZ!E;kg-iEz-Oe-PoA~R`;L+vm(u>T9And@5!R;JIm{R1xrhk)Tu)a3%dRD&7 zK+f2tq1T`jFq#{!P%UA1X8ncOyyG|Zaa<-AcY(a3Myqp{h)!o7kq-H*zj$*ysH6>| zak7<-V-+`(ols*3Y_Fbl+N!`pmZ`vTk5Mm?>+AVEylX6tPo$52VGC>e6RxV79&9O3 zqsd8Q@;n8-le4zXeBaF2G}x#nXcCJ=#WVSSIn+u7;)=zE*=GHjnhn_nstG%`}l;CKrVWM4Ok`OaT!@3oaggT?nSo--BC4q(U->AGggJml(AD}K)ZgO6j%9JUP;J4 zJj)4b0gwI#lM-|q{%No(>7TKq-J+#&-FAMx51T%;Q3FeMgWmksl_N~@NY%HF&I$ei z7kU7%TQOKs2IdH&uY1M%cd*UXbWixEO!>R-{aE}z-0;25<$0RbbBc6*KCt;Amalsx z;2gai%`u$Oe;=fHwLY*dbjImb#1TT=o|AliKveFnE--8S<93cI0P!jDaylMVfuF)UXffu>g!|mMUZY1{bO#qyRdIBb5w5Id-ST^+}ge#ZS!}!+S5(s*k2ggt1;4{5$W*(5S{;!n`1~* zHSuGH(a9b>l_lDwm)0@(D$3;_U!G$1d8&4ZpLdv;;mux~+qt!eH|HI(-hR{Wu`?;v zag^|Zf3?vXGR%Y^IYocxIxr$YfQTX7fAhEhfB4#eQ_+CCRSF~{`^HH6-$ZgOT#M$v zxn?9ggkb&W?_2&CUri63EuCuSoD%ZnW#Pdn?3+9s@x02jKfc6Q9H8pWP`ofLAVTiK2SA{j=M?`I=s7 z0{6plz$-pcOA+iA#24qiV9_;A!6vWZeExMwi@#?>nKi&X7hfu_joD;;1#H&Pu;DYc zhn|1F+P}Vczvw#m1N}HwHGd50P(YQm0tVR(bmd=rC62o!PBvs8x(wa>WK{X04A6$7 zpl30)A1_5ZU$_ODkqH>i@=E3+w09{Mk^?|p*#G+RPSAN#>3AVV(k{b$uLzK%V`bAG zzv=H3Zkr!!cB9oT3{o|fKzJlM83?dkA)v?$BIVku#)>TYlNg<%)N0JcuATm5=@ zQY&ynr{-(JwZ6U+-uqLZo{W61_k7v80jvX2N2V67(S-hs`B~A$Pp7_*LDY5UqaB{h zC31nYvBXq~`RBROb#WRJwl=9w3Zt!km97qe`?vpVoIa=Krl1f>VMZ*z6YH`*J>{{t zM!6TyetD#131Bg1?wo>`vB3X(yD(T!OPd@h0q54{2AAsg5cf<#B)k*;8 z2oZxq5Y?bR9i(Tql9Q-@N+iw>o$hN$+t5}qKD-Vh0DXtvac|597qh`RKbVkeSQ`IT zRuusGYadH`@Kff#)Eqtj0O<3ffY8Y03}1=V!P~a|%(CTXhjv9lF28;-P_uo!6k;|cq0qs*Jdi64b;bkEdNecyZ{8xIA{RPv2h3rH6#w1?H>8=^eNf{%K9psi#_1a$^eOq`|_o-Tz9(o z1jHYEo}cdjsXae+K=6hp0Y!tw?E#U*f$2k_ZImd#NxuedvKaER7xM23prDi5MAkj? z+w7U5`!n&4w+5!59jJfjXOcyO@oV4;KlUb{^#;{oARX|{e*$*%>x4t?RJ8CsTy(RE zG$2t<8jA3nFTu&MBz)iEf(&|v^+&}sn}<(6ef{V#Q*$M{;vmz4uANY55+S&>U?#F& zwcUVch7WC9QyB#R&4SX`deD*PV`FhCn&b5YT2%|Th}<Nhm96?FZoeDEjKGCm780Kv1+8-<)yuNFiPM%peAHn8+tPg zY*HQ(3oi&Yzt0L(5;=NFm@x7&pzh7E_i*XF5b9BH?zp^H%aE9|?n$Lo4?hBw?H{09 z5U?q8Sh6|-nl)IQ>HM(Q*RFbZnDi#JSoSC2@T`ogI#Qu!ET&^HTC9y0%_SKjRW_M-Iq`)y?FZ6CLdzcFTm!F%!D1>SaTSzCs#N{43+@wts+rH@YV2yx3OU7ITXMTACKLOybLB z`ZCom`PZIoMN9!Eez?#~7Wp0<%T0E4ws$EQB;Zd0WbAh#W4FzTV}k% z zhKW|;sc5q9eq)tr^uhp{t)L7QI`kwmmW|n!Yxg3(u-jr8a*Y;SbvhcP@A;7_YB{^l z0ileVhfnw7&CWnj)mG0bsDkWJCxf66b~G(Nq|VZNCkz)mKiQtsErwJdVUld!3rj^q zvLig(_(JT>Q8xwJ45Skcz5sNicJJM>>~lzBdh)rV<)Gl=1eZXu%uc(2UnWwAhx?LY~YfVpjJf zHj!{0h}qD2<#=tzix{E@F@zoJ5d=AJ{2eqTs^YPwYR2c8dmk<(mQ6Z$jzNU^YEsGF zbD&l{;(kyHZ)M@F-sv~+)+4^~nj%slH1CmUA3@fBiva_o2Ped`+pP{3TnXhiA_ETd z$p}aqpdhUW@veQF@tMmXhq7TjhYqB-K?2sj<6=noIy>3cs65%~9FTt?r(yKGPkyhN z++;LLXj)&cKwBI70(v2+r*G79xUk17wn9kxopPPA2O6DI+OpMTxzq4FSzOPfl{_dr zmVj@YI070CNdH&o7wU28N@>MCMuFC=ZT|oiV!IR}hjb(NrPnU$d3Gc&wYSs$GYjBH zVfd{3_MhDmlW&6dr~MhwkR%ied-kOrRCEU@ofAu*{CEN0 zGRtQG*1>&K22^xzpu;Y#`CsLM_aa)~N(b2Ot&N%WUSZ5LuJ$Mcx>`_lBBYiZu71$9@>gcWgA(iRwMhP+LLCk9p#($ccK>4f zDMR&xhO4|}0>+n92|Z1~Qv%+%H**%&Q>@c3d-OYxf6c_?w!Z8&1D<^qUFRY0>6Bd_k&T)1!o?7Qna z?cRe(N`6*~GZ&;j?ecyTA{Q~e&tfJUi(w7(z*xfu`|BsQ#?Qvoux^>{UqU2 zamURvp!n&9A)2n3K>!Vx){Xw8=I{64OFI)CdTg^I8`HWCU2ij%H=oBd3ro-ltf$*T5dQ8@Sf z{LbG!;iY(;25|;jL0~h-;%n)YVhkyE#bMlE2etRsN_vBLVkH`s+0w|=TN{`f@E-V{ z?&@vaoc&{(eBB&|oe}pn9eDT#jo_ze9m97yKat77r%4m+hOA7n&-hxYN##apTqn&S z`Pqn7(di-=s)ItfNS0@OF?6$};wQ?f-}4-Tr9gYW9(nAA8;IRm_@K=0@Y}=2it`0X znM{v7++Ggx<`Qc)eg)1!#7%bNsU^NwhzjwTP6LPGS}S`?UB569zT2;NAs^khe>Nw{ z-rkik(l;PlpB)_3yTjTSa2ex|s9N3Bq^@M0=#=4i^ zj@N5_^*;+d|MkPU<3amU(2_;!baPPnWd7%iYLx>u-|;FMw&c(!#7Ko_{jeKW^zXdm z=zXhGa|T9Oh`*JWI9;CP-DGf*9Es`uJdn$~GdqHDmEfpf6gBwGvVNo;dtl6=P)_|~ zdv~GeC`d@{=e~F=>yPg)PpBlk%ApkR9T!^vv z`|=1mAXu@~uQPt}H5f3ciS$0+BkU{|9J7qWYRYGyhk5L-TJ29hiy;$@)jMn29!|(C0A80(+ie3N#{HJ6Ce$-s`{&Wd&sFA1DyZ0Z0_W2J~ z=Rg%Kk+Ef;0Is|Qb&`fE_YW`duo&V3gF`_2+q6e#kH|8$=*dRoHbTX{cI!*+S+PNh z^%$r%YoMe0%Au1x3Tg$mPV|gDC^!fjXy^)z@x%)eEU5!{WeyUIu3aDJ!bMT{!~)=< z5P~mrw;Hpe?{r*rc;351I<<&}lxkLJz6R>2p_({2!`+N);`!(H!t`q}n$~nf(C(4i z8-b#nMC0)U6Cd}7R<(7~ zVUg|kdmrwXfl?B3dKE$jsLv^a_K$r}HbbEP3CsX8r3gD^il6QbT%=kHUy-E(*Y)W= zkdem0+?7s(Bl5B13TWMFo^|mJ1B_GLm3Ql+_>F->Xb(=fXi)*?SDFQ53dD+s>Pe`2 ziGx|}6wso9CRdbV$}V3aoBj@}Z67clpsQ|fsKg<>VF?hQCxQ)1%Ld4Fk!RNW555A) zKajMA3_4UP*qI`rpKf2I6}h)Pc!jl#pdb~2#5M!Llsg(4JR}=KdM0DixHOhPNDkNq z!xH3Q21TJyzqJGSJzh=gCewxe$6@*jyI?{qaLMS?!*4t*U1Go+Ux3COj3iDqIP+hG z^S?M`;A3QjXa?EfKr5BTV8RkGG+6qm|FxRT(f+zaqM>ux6sTq_DIs=SA8an%UJ!)Z zV_CHs2UPS}OlnnR6^ zYR#JmbAT2HedGl*x1& z_r;fU#R~syVGUxKT2(Zl(&`5vg zSPekm++Wf?PqD+rxM7eYK}4N?1eBZn!pnBs;N6R0+*(#V5@ssV`oVR z9uP$*DdEN@IO*8vczh?3$@z)s^eaFOJ_JbiBbZseU+d$23_RTq@G)Ruj`|qb;SX>d z;zUlLv%}>%>wPc_H8btCt@iL~#gZM^P8onnJfUg8nZ);#e^6bVC>9jJrtdgAFB~Wu zHrgctn4?C|`mIk8FIWQ@Be08g{~t*JQG)1l*aQ61IAa8tIU$u`DZnuz@a~W zD($~3ZRz;_nz?mWlwdI+8{?U7UgEXYRFKot$k8Mhr_ZRVgat>4F<|Ji>> zIjy0if{3mj}#9+04{D=0;1Wu_-cNt7KgX_RV;zux(Y32}m zfgJxY8bR)D9SlKdC%CN3_0Oq(he#*awQCpEEmR7P*9C%^dg2%~M%RR`kMPtPO_6#pDOFR78Nc0$_7kuiH%u5zKmhC@0^IJwdN2WVM8NOTX zY}b-~tsY#o96^3!49(gkcfmj~RM@8Rz@RVgFevAaAHM%@n*m2)IrZJ81hmT6|F`8r zG%OgNDkC>`duP7&F%qIkrT8FB(xR>P=F)OoGPA&ezCp9Lfa83Vxc@un(j!-Z*Jm$e z=Uu+7!>72bs36e33UZ|>5l=cdCTV}v>Xtf5GML=@g?bUJ@~4#p-j<*Q!ggE z@3{UooK3oxcDW)jz#h69aQSmHVib_h0pymTFUU_4*73vNDtP1&!2!H;Ub}Fx2y(b_T!87?}PQP))2&FT`mj@0XkJ& zJCOhWfp-Y>cSsfac52`?pu}%dH?Y`aJmH#&%%wMvz2=*1p~CXEf{5b zmFCn!c_mz{@6zZ%fk9?|zo63?HIXoA_W5|E_RI?Oou=}OddU|Yg*oUGw7YV$N-sCJ z7>U7VF$GxgGC-Lxucdjsyj;Z};C6%2DK-DNiaG3tz#~)8$CUzSPSo#sZ3u0L9ipn2 z^m04?`A{SVRX?b{>xFzq{}j}}z~ctJDcP@FIs@Ts}#g1qI?@0t^-Z z0i)VnLtN~T63M9f0{X(wO0WNU8#@{hF^!{15`a)dUxorZ33!maHsWsZrQLkssg4bJ zWdQy^02p?Q6g_m$FFalM<<~MRV7gWp5SD-w|U$4A%(M>IB%z`TR4HCQn z3Wca;&T|6JkPCCj0CU{UFO1i{wAv2rGY~!?To(o4`f1`$_N5J^q2<9!82_=50DAAw z!~{TX4gfYQzRSArb-C=@;LNqIUA_rg-^J^H)I`lUFrV{NSCGkP?AlopRlDi{x<#Bp z*zg9wFql6Eic8H9kN{e2ROZkk&wh@sjg{B~nv!>X(Fag6lmkNc;{s16%ZqLU6#Ho4 zOW^eHuEGDwaI7Kl_01oG`Q^mj(b4vsvEJOb#h1OwiT*LD=> z>YeuLu!#fDA%_0CfhF=ckcFd^4FNyU*z5!t1m&n+o-XXXbdSfV;T|x$=P33YT*`0& z@=ZllgRw&6|Bp#5U1-MRuUg*6BeEDmy0*;H%mF{O2{GXD(~L{%{lol6_Ya-wVJQoN<$%9_^M`M2ob5YcLg8&W7LL z;}reo@AKiD{x6qP(ko)-fv)ux+@)Yb z$)uXn=MZKoM0FgA-mdlpFt5daju-ULvxsid;G2mD405^ZX*VLrAGFYwrR;-GPV zAT38sfue^Kt_}gt-PFWuQ$7h%_g0~lJ}?<2T5ZP!_x8OsH_+(0zP`54K51&iQESNJw*AG)t&D;;3x>brrl z#F31FN`R^(ZyN@#Y6r+a=Om}rU*3RxSSxC!y^157A>q9S?hU~eC~7Sp0hjjPn++hw zS-@w4#as!#=0E>Rg@;dFj8UAT?L?NsEEQ^T>O&U{eIJf>4brhFl@@BIiT|aiewTK*Sb|bg&L{r%U;a z6bI~LImkCY4BXJorc>|@g4UWLL^KbqPQJs@90bW%&Xy(5DQmVtz>WbmkdENK^>RC; z!C6B^-@be2<~dVcd01-lE|_Nw*;lNU9n&TX%>dymOyP#g;!+2k54{JG@GJ&k z4fe69I{a>#*nb^r=>EC501XbXB?1pWOC;s}q_d^UMzrR(@- z83T`k=c4Q8L{?!6qAFaK&sRuRMdL_;l=Mu$Mp<+Qa7nV1I$vI49V#H8n>*k(4KBsh zM$56RxWbPTg0LgG>Z~af$NDP_G>*A7KN8}EH@w9Zc32>Cb?8+e@L54Pay9cj+vjiT zfcjPDxUko5;tjHJjU%#EY#F3+DO*Apr2L>uMwpIDfuRLez3Ku4t2%Ce(0$!}|DnAV z1SFE0l+E{Jd{44&W>j(Nm^{Q^2OT;sg!~rO3LEnt+y72W(f0C^EOi@(^)geP47q_0`o{Z0x|*`7)}dL%XJ({1zv?) zo|LFp$g31&Pk+$sqj*rk$!b=yHifP9(t)O47NHhvrc$WFFMuS2I3k`6v6fpUtrV`= zKTNJ+S5T&f45l@Ndor{3TZTjDQnHM z<(~Sw02*2(K?k^W612~lgxWh0ZD{4ij`RsxM{azkC*oie(+O22SdOL<#R+(wqt&%$ zey}M-;Jb?Ke4J^F9a-W=8E3MZ@+_FwpNIjE9A=Ta4Vd8yscBSyoG_3%PU|~^MrCHf z@7&G8XjVS(r1g2wkuwwqYYD_!k0a&-oSSA_`DH}30hw@UWzl{e=S~L8l@6SRH_q?6 z<~sXD$BB(ew-o(^)^mH@r6@cn9*ulX<1XpCC0)8Dx*O;Gj=(l#&}y8Alu%6eXyY*> z!Z5Iq8d)TLs2$=i#CQm})ejHuT<^usd^U7X@6)Qv27ALBVK7)}pI)4+z9D8$t>sT1 zaHrFzw33+!l~cXoBBRfg@Ms~P*d^oW7?j|UCFh-cP8vvm3F8>0tG2RAu|iGME|3&~ zH_dva(t)+N!Jq+WKX_@)N@?2h492RBNY3U6o9f{FV)$Ak&^@>2zHBl){szEw+MIkj zdN6z?4D2w%<*qV?M04ga1i@VbyM$P|Mv#5(f7Qd*eRy zI7_DdnU_b$ONfQDK=%^u>NjTGKew-a;LJtvIFd+?9DT|}(Gv=9f+;ZLxIDK-9x9m! zpc|Jd_+d@N#&nVLk!<~8`t;ruUn%C@tWbVmlNG0~wLjZ&>i{!gB_lPrZ`{uYYX zsi7$EQd(e<7Gpd(5go*|-fZW$3Py*sMc$GtWpMVY#lpGC2%Gcc3qiI<^6{VleaA3W z17k66(X!5_$+{6E>ynz~-q}Qn40~JuHqXa&)`Efw=e>$e>2#~S()x6Dz-$x_fqDlW z(ix~;SFqF1b@DbWHR+IKrJu^n^X!l2h)&c`WlvoGjNkSOajs)patX3B=-Mg4Wxi4M zc_4w^W|a{WQ?8m}hN3IfK;QIa;dLPYNivGwG_Yim7>#nAt-JY!xC$hxZOvR|hEH(Y z>8gs|KNCV#{sN6K;~MIS-Z)`R>r&}e+-YK%5GmuJN+2#{vWL=GEbkc|Ve&X9V_;2) zEB#(UB{bgQFDxst;Zv2#)hE~H=4n+NP-;WMpuF~L02I!_5mv0>5Jt@=08qlq9peR% z`A@K(KKBL8f!WVq*;nv-R5QJk#Y9H4Y28({bgSwTAZ)Hh>PM2|+$SI-?kX)|X8!)s zf9w&Cn;b^TT+L*Jfr=P5#S|ozC2_QDw9eMOb=H6@=!5C;Y7vTtZ2p@v2sZdtq0}k* z=C;;y)1QfBnpiFPEw~L>*y1;3P+XIta>59rJHOt>`pgK^-p=2=#Zn}l@3bGpU&rZ> zffj8MZIS5Ia3kkRt`FibsfCdIOwUzFSIR1BDsSeO_u_i^&bZJp%*K>b@)Ku4WHO~|4@GhpNu00H z!7E`!c_r4K#i*^V@9mxiiSZ7gMt!eBbrywQ6&$n>yTx_t#IUxWXP7?$=OCB>b0}9F z-sC0UN)dB+MySE8rwTr7R%=cRB6=zM22HT+<8z+z$ZW{;mxV^S7UEuc=kK;vx5XUz zmbY)=SrfuP{ChIlJR|H~{j1z^wm^@c>Dc{U%vYufg?b9~l&O`7^EMB)1y}KQN3Yz; zi<;x}7qO2!qJR$iltCr$QB0`=D|}LRkrAeaqrpoGL&)&mlu@EH?+^#ajNsEkzAE_p zo9XO7vjAT{{oa(>jF2h=XI{*byDa~<0ggJbm>evnjqz_5eIa*g{aU0hUU}Y{POFeQTmc z5f}WO->i8BB_=i*<{TSG(X#)JygWRZu7xTSeXA}){*Yc~lyi2b{*es*CS~x=&6kQX zq>af2t{vS`5`l!YERi(_cH+A?3nIrf=DIQ&v+wluJ-42ZL`TgL2qo#*pjtM$ng-gJ z3!@#zqazTjc!!}l2?&Prc~2Qs{vp*ae9jLy>sK#$0@oWiWJUVF zoj0nQ!9G-6ELx1NWx%j~Xe$qogSpXcEV4M69#Za7$I!V%?F^_R+_SO2kgB$^$8cFWWx|{eyFAl!xrG1usG>%X8CVuJ`n2*uM3CiaR zm6E_KH1Wq2`aUPtPTKI13x^lSPylssYr~?n7)`p4UlMTAqspm3z@O3ed48y_tu<*@ zq$U7eS4@^rVEUFsDEMk7oEHm+etr2FjFf*@thdF$nvqYPk9tfhT(b_|>}XASMIkf- zF??q6afA0rtO1V+Q}*R^Ms-v%-qCn zsB$+RRNaOkfEnMJ1u3)~SwFc^qICHb+T$FoTaxDavDRBQcE#F@v3b2mRT~~-RycgVfz_Pzk&qcE3+0KECO>FWf!?t6P^mRjO_kJ@fLme`I%qi&2g zwU65+sLAnK%c4vL_!p>Z3kd@f)bhK^TCryu9o0Q?rB2+38%wA|cN8_)8EFGCgSlHC z2*ldRoVZI^*xylL^(0KPXE_%mKUYsBl)1_aD=Fu)Utm*tkHD#+Cg@vMX>t=%u@oNT z9Ju1zRImEtY3#pM-KJK|zGOe@_~eA{}}0ITH|llrk4PP)~t!IJMpgEk5Mvmy;~fkOUcf3u&@ zM_F)~JwQJkasSYHV6Ymv%n(&x(E0rOv&o9JClMkUcOO~->Z%~p`96=l={q>;S(jvj z9P<_Hs$@!=U{5pblIpIH&P8tC(GH}>s-Y^k{nm(*NZ3IxADdI zlruHMWa@!e^drkS-d2*I{F;~|m`x*ZnR0~{ZhPoj@cOKy7oJ?`t1 z;#4H|>gjXKD1(MXs9X5e> z1F>baOW`kT^C(u0bH(IimX?~>1PfZR?Gun4U z6pT>Ic5b#%uc*+ec`vKS{o)&`iV%#DZmzV&PTgwK8cHVeYjZVz;vuQX=viw#P;&c} z=K5g30ZVYQ#FrKCiX+cAWvX=Y6SD_%ULgYBo~0R%W=!i~cErp0n zU0Uc@ITf#3usQDVDSljj;&A^>m2PWXRo^$qe)Bi6xhCy9vm^LjJGo z0xMw>vhJo-ec!V2t`6*t%C>onsKT5LZzqoQuj`K3@LTMkjhh` zJeU#8SysxENq%;cwJaV7FW^`Q#K8+UJ+)R{>$q0K;<@P{^|U)dmA6saMuCp+ zZV2(|Bs8@)JA!M}F-}~lUdxnVfn9bg9NP@;;O~hXpL|4^TDTbl@4R_#Mso^tz3*ti zj2S=?5W8SgVG?vp4n#E1pB`LPG~v$|PI9hG=2N|0o!^tPIWM=RGN{QyFg5`^@;_xL&u+1 z38ljveQL9Itpoy1g22g0m09)Rv=`&;(SQ=IHHr@^`dzZ=h1=(kj`(h)aKo%o-l%KT z36CW4%bfJAGryc1VE<%ro4W#LkoA%HwhQhzg!oz6?IIsPy{|yONgD~ffg;!E%j*7^ zPL)Q`MNrt(8_8vBv$3=udhG^|?XtD0wW;l>SfeD)ldT5Rzx)Nd9)sdGhx|IyH$pRT z)Y&>!nQ*xIr3||iQmOO8zM+{^R;yDb(UdKMQx*| z8G7iBp+P`OI)`oqLAp~~S_$b60ZHjl1VuWeTR`a)=?)1gLGY~6_x;XyuIv1PKQpuU zUVE?D&wB3riGOI{Q))q>CdK^L>t4}&w7JVnG%g7I9}sa!|+sqQ+0Q& zoETTr8K(F>^D4gw)RVo~JyOQOu_?K!=n zQPj<$KaOe}xz9RT9Hyrw?Ix=wWCK?KLfmB7g0N#bKHJUUf!+z_WW(5BEeG3nm*Chx5e-&|}XG(O4OO zpDMFDD*JkgVmU^|4XBw$SuVa+d3SX7++=MKJ)n0uo*N}qXwWajB3!a{=hH61v5>A? z`8Pxs?vB%E;y_8;zFL)E%o-+%JGU**@2yMRTFFbuo+(kVj0~>3e7ahTlj~T2bHLXy z-pCrLX-;uyzGF?1!S2~w{yULeyj-IJB$-898N=Ca=sR79Z92I zw|NvkRy9e#mLStPFaX_q-kPueE-Y)P`^JY}crDP+i>A1hQebDmf&5IjWIE&XSi?!I z{E<~*Pj(e!aGAsN+W(q&k02z5=UVAtP!M!# zyiybiIr~^kdA5)>R_zeJ6p@=hAh#QrG!i4EsX%9?*umoTHv-wjePFF)d#W>kSKuWZwy835xfvOJfAjJB-QR_cdU1{X7^Adg;DvNX3&Nm=ifhj7_VF0zQVMLJ#ZTt=jE5P* zWk-*=hAoeM3E`%tCcJ69?rXz8cOI1&bLka+=*mNeGKF0qIm*1Kw)wig_FQGR%v3~8 z?6l;J7y7gi)-NbsPC)U5V#18xQZ*p$f%j)r^;KM@Jzm=|gONv<4js7N(F;+^JccQ(j*8345InXcKCI#gaFr zv2_F(hOB(N*nZNAnsvYV<_w<26h^&CIxThiDIri!v3q7%k`aVd{IW%pUQ1g2kAi7D z#!~8|NZqolvbJS0L9F{WDhejpBL_lKn~%zqR&cjK$lB zus|&cHobM4NU^}O*Ou4d2tP6J8Q<9sL!b&#;hhz^q-ohY2^s3{(P<^B5TlD|}7NI1j$etAVKh)uDfMq^@lgo`nT`ykV! zFye<1uHzh0_4AKfmdK-?cT;*epxol1=217M!2)xR9$R&Gzli=yqnM##^W=~F8y5@t zUuL3nwtJJuW6b9dvf?}I7}2crd^EBN_cx^5!!Zd6Z^SwmyW z5EAk^m>ZMkBh#i2oX4#cm}WYK=c@&G1#u2#-^JX8UXJJUk&ThJVCDwJ*vg;bOjEY2 z{8F!F4!=;p+mUnJr^trfZ>9Z>R}5@T<+{Ae*NY0#jsAPwx9o~6A(!JmySk|h%t!W> zMVi(i-Zxq5I9x*AlT>5(+R`fSXxxooN}HU}NWDaRJGCD=#J}Kc%g;6uom?XIx+d|y zvF&Rs=Pl2Et8fhK4@r6yucpZ3{emWDPkecnO1}4IsM%SKqOozkwfD2h%=Il?v1a{c zZ}qv4`}UqSDtxLfIIDj`Z}iMn)CJd#Rc5TUWmo zvtcRAy@DT=Twr4nKf!XunE{osUnrLkmI{e+RgXds#kMpuUAi^J-7D!aEu5n4Wfqti zznriXNLBLJ?N7t}Wit=)ekX>QwQ4=JqHAT5_}DwgQT+!jL6GW;#{%AcTMX*3wVs=!DB+v59X#OtAJfu1%c)1{)fV%dGuS`AwZrmWL0&RBK8R~qBL=?d*gMW(ip#7{z<^l<&9{R1+gnNO4)>z)TVmW7t4jn0u5*Dp7 zv#1B$<|ndLt?!wLpxr8m;@SFFj1=Ell{r0~F%FOyC_}ahgFz?tU|+ZZU4!mzld0mZ zHRJp~{{F+>>6N++LI zAmuUIA$OXa7v6rA-%H2%ia6A9jc|{z@}Tl4v=U(kQ@lzM{HPicc1R^eR!|GU@fBVS ziXA=*%7V=5?&QwW7(P{{VVO|mFSrC9>lpp+1*_VW{sg31h7x&iP@gt3*7~r!agM6=aki;fDL=U<9CF6B~oqBc2 z4sj_!Dthu7C|i+jOd4k|@$Jl8;v!*LH`Q66+IS!jO!1}Xjt;?}ogb#6^vtby^S)#E!&^#FZ|W=Cwh3s)c=|6foiA zSWD3d@$|b{Eit$NI7>m;eF^^uXZEJ{*& zS;7~7!noi&PG74P&c{ae?p_=iOY!IM)Y&KW14l{0l$jbscP%V0ZkupbaNnYmnSP3I zfz3Os{lPPLdDe?G)CxRaXG(fUaf-JTJ@J@a!-e#0WXxxL<^#Wf3{@4*a4X(_5ipa29MZwWUorftBkpNg zYGDuTy;l+LBChKArOum7Ld9ghOab2UtQ9^hq*FY*E`{oagR@XF-M)2wPT7fU!)s{kUQ9X zjmkD;JCZWsRHMz(j#LZp7W*Ku21#nl5aY~Y@KMrl5koN3d0PoBNy19v?04M!*#b$3 zHP2ii&#!f^J%*w^P(JX$Q%+Ud&Vy*Xa(W46V>64TI^*hU8$*9j`0#3~V7lN};jKTO z*xo>0|Nc#)2op8=B&j;CJ;j4fH|MP9K|o}FyYMp#cy>el>WD!I1uS98G+y@V7h&5O zb(-jTh)T&71^f@u7tEq0F;ddStlX-+wB4o@7t)vltd5={3$<7G0&NY!8(% ztV2`#-R&i;Y1|2(2GGPdNM5h}je0z6fUqwJn9;DNpXgZpwB4%>G_QFxO`vkx#vIMd zTC=0(k12#4C=kec3n6|#-j+5!-$4X(oRUS(KS?EGx4{;A7OT+kxzjWfmf?koA%F(K zke+yj9aE@;Y9SNbKdi{L)Q5`$XApB>vfGJXBiB5^?U#mK=kA@pAdG`BY6QWkmKA9F zP7;*L+UV=RmFS8jyp+kKGGc`9AWLVj&+;r9S0wl8@70VqRIm}Opgp9efl5UuZSIiK5?YaBaYeVT?<7#*7GO8+cfr^p@L*eBy z^V!Xzcs7B2??6K8ewx~kT>0I+#lMdWfQ!I~w2E-p`U#P7#7dUN_a3I`Z7xT60o0NE zl?b#q?SVijc0C(IV!d@#;|oK#_{OKWCxO(CrKBKEPD@zB}5 z@M^WjuADLtV$#xQmBz0-(h-rRH$*CDM8dp4rK}%Vv?yT}(TK^N2 zXm+~*L(WYlk+QoQx_@xr|0}!!*pE=j(`WS5{-pnSC3yw_zsjHgqd^$%qlt89Y{tF5 zD*21!01N;?iKzc*0DrblOMDt}$_`@K5#hc6&@x4A;0(seUlRRQGL|#l6#ot^$}(22%O(yS9|`&YVfYx65e~KU|Fpv! zG!aUKRDU(v>>nS842a$TYTE|ILrT+)h7jt0W2+dJQ@RYs|9}@7D5v3RcFi2qh{I^7 zp_OUny8>BLIzV={6tbjPRR1<=fd~TbP!eS){rfR8Gz8&@0GJO!GAKvfZ+7B;XZZ`j zQ7QBv{u=WjkC;OS=$?;Y;L|v0Nu0_?HO*-afFRDrcz*`0G@l`>QAe4i>@x;!!Uk{~LTt7C>oxc3uNWO={`?@4ZI& zN`TS|p)uN$q464%U2Ql639@9S3uz4h&SVWid`Z|A{sZ4X z6VHL{=R=?Xt3f2kZu~65{f94YB!PQ=H@ElYZxeZ-fqEzRsQGQ8T>wl&n&E3}@V6xy zBthoLS>=DB89X$An#xfN*u~d7PAXRZxBCF`22>CK-{D^q8Xz1r010XUc+S@Ug|&Wx z8_dzcua}7UR>4KrUVnTc}l z=8Y7VR6CYO|L*WHcpkAwP5Ay|ZSzD9GnH9^Kn^kk{7*GsiuwOlkok!C6j@&3(!cgQ z4hC2!!h3Ulz8?p~T7Mxx8z6Kk8v4hhf!l&`>H%ZL=0V_pAv1pjwK)1z@5A5oWlcA|exGJ&`wVz#Aee@}Lt z5W#>T@`xibOFY*5fpiDg38a4B0@eFpaQ19>G9mDv9SNNG|E5YmYNH+d;Zg|>0zIzr zc^-f!i~#2F9!TAA&RqllDzM}WBtQeE**9}O{@Z}Oz)6*E>?(Q#c$A7Y69jS2VR#x! zQb|Gbmxlw2P#_-QkDC z`mZNWgGPRc{`VkM5U!d*Mk{6%e^_TOC&=vBLqmA!5J>yEGy5$%0u8iSiA9(N&L9kM z8?JP-X42=edR4J);c4x4Xi(UcJs><~s8FWJfxw{zA#jjUAWp6}81Kt(9H}td#CvaM z^3RHBhB2-Zo+b<9L=bPk*chz&{>0zo!<4QM(OP}eTD!j%04Lo5`y$EM;_iWVEM?v#GVn(Kn zBQ-qmAFbQdTOzy{ih}4t&>j9*MPLiX)-?pp1?*y!alfpMKfCF-z1x_$U)8D>p7z+E zj8T{f7Ew?s0`945-i!FYl>6O9Bj9u%lEo3};edg<{)PUkITmB@h*zz8)?+kNx<^~+ zl?R)-;Ipkv9|j?hsyJ)rhWRIfD9*6b|I4FSka3Mp|4oxO_h<3SykpH@W?+FM+v+4M zq~lFjFy4c*yqN)=?McE1s}2JexS+0CyLSNqa?4J+mrwP+V#~?&TUm-cHsX5s_?7P-bZYz@OS)<*%v@ycBfEus9>00i;e4;SQ9` zCm{fi%vyxB0;r^NQ%^gSOFK-Sl$Sm|Z8vExp_ojI3z*)bP4fnnEl~$2p$>J?t6N&2 zyl4NjCqD?>7JtW2urXYS8-i}H=MnxnyWBULx!JW@ zm4eD(Z`lbzE@l*SndeV{<_s!FQT68a(^ykL+%){TyZMIDBp_x;go7<)7QymIl9zh# z&rm7=8B>;hp5e+7AQ#!MxWw1?z;D-qbLGU#2C1>J$q1(ikie;lgKr6JZH5zTLN@1s z>SF5GIVPwX6On5bQTwkxMql#9++`b+-D>?JUYHK9~V;dH=HfNnw z53-$k&b}d(6F~hk6$F4Fgeh#oUSd^+HG}8VK@G3yD~>Ux6~a70M;!`!1oThWH~E^N z%0F9>B?j969UQ4@PwRIuFq#^(OZ6RZ2LE2Cw_NOZ6*;V%B!e;$!TPk}rLQnzk|#K; zj7o(#;lPAB$sh&BM^Z6DP8m?tC=7|+rt@B>`Z!aPgcSnek_2Y<$jeZ7gkcl#q+#|O z02Qo5aJm5TD@0GZ1fr+~Ky^~%-XNo5pjAPJTcErn6UQF_H@s*D+PK4ZKUogH8h9flBgO9Rl?eTJl>@ZU+Eulr2ul%K%^+-SYu=X#t@lp~3Y4a>3UfnG!Md1+s;A zFF$}ec_0s*`Dc4(?qn63;d({|)|OE^BqFai#HgLI_uu4Q?Tx zKv$?eitH&u)y4VYgBwz@;lOQ&6{M#;A#FNls*QwgydUNu7j`NI|Qp6 zr5jkqBwsj0gY^Kq25NR)hueA;SeY9Vgn$QnglbTVreJSvvoW+XGLF}Yk5LU|X-Y&)0+xsM&A zomPlUs`F>RR%~DLTf^ne!FJ$<`||TYL9_K$+kyGp?ML-9zTcm}Kfg`D-@@PNRkTa3 z-bI*%Vuq8yoPd$^%Li-3SlR;KaQGdYKuNR-1=J^r8$0csTH{bj{gz>3UtLv}Zgb+fN)^bJ+LEZP)o6Xnn%%hWl-*PKk z5Dc6)R%NcX_y!hp^nzQR??oog}t4?$e(5I&J$ziOnW+|gpu7&}ZEI^WAxvM3k`8owWfsQ(n(X~v(O=|q(0s)|E+gY+{=h`LED zD|f#z_fmapN}m&8_p9{1AY+#MLvsO>4uhfK7@MooL)pZd-p~utp(_RD&MG&fBilxTicDvj9#?9mNnI#7@sy4gp!p*N z(q)24@z5JsMiT=pEIaGEo|?HN$W!PC9TN;c82@`jKw8w8ktj_|85(VRaO3rEd(7Q; z%bCztfHZ1(%vU>%Gm9=ROeI5YupX{@s*7)}n3g0%b4cGehjGXC0?H(Zppndbv?%8O zT2KiRR!CIeqU>x(+^^+AT7N)yKR%_{1~la;XW4hDVzVRu_&> zz(j>?sd%jfO6OYueECzramArYVqlqO2rINpI6Ja>`Y0iybOo$AhG!f1GrqhMA}Htg zK~poAr2kyw*jYLM9*^$*4=1mI2{*K`(y-E@Pn%LXEx!myVjU1~BJjPq6;MJJ2H_;^*Co`mo9XlM^njqSN*msBttnbI_(?z{11e z&Iq%Tj==aHk{+&O)q0(d03Eg*-sYn5wExs+G9CxCq{(R z0RMo0VdKf1P3$M~PzzL9coRW$y3q1!?p!BL8THMMD1pSW%o2?ub+nwI6Ou`D@Gh}z ztn<#uKFX-elP!2oUC^5OARuL5#k`UWtXO7(DH9Mqs1F)H=+f)3K)4V$?S~}n)+6X~ zf9IZ;Jv910s|;6tjqk!l9+l$IX>tcLV@9b19WmPxM$dbT#3TE_GLbE8dnEHY+7_Qi z0=sK(`?+X+!@C0^UDEg>`gNs(p(8zyHycl$;5BHH2dr}IFBJE! zE81&9$%!UhZ|zAPOp@MjzhA75tuH%!8LGA%yU$VaslEss{&r;rFL#`yqBa z;!U1T;Ta6>F!g&x-L{`GOc$%0_^a!#C{R z+$z$cdpCwHZ!lYJ;ekGTjtE{JUu~k`_5Ior!DahaEBmGa(dgqpn~|Nd-I6PaMz_L} zor2;gthuXA`94z6USE_WRv* zQ~slva6yc+xRWq}ZUsi(Hesh;Ug-zQgS?|Z{v^IPjWt_vT!67U8T~0QH9Z6zcd!fo z^-8k&qL-?8D8zIfdf2(}I<~Q7hjhjD;l>P;cQJz;bDVzA6XsrlxTBh|dc5#&+_ zY=;y@GweZ8UUQYs@rwyu-E~gaJ@TepocOg|Fd_BZ8p}9QKD+gE@$i^F^oP|PKX2+! z_AvJ`8!^(O^gEQCse~nshV*Z(G~A_Ay3j+VA6WIRq0rlO9j(@n!ErPwT|eFQ)`;NF z2?i!h+sIRI#p$63u_)XR?I#_PjSxpyZ>ERNjvv5a*PW_zSCTiT(y1&IsqM8tj!Cy; zXSnpFxO{GIC`b3{QS^eU9IoD%Z{Bb?!O$a)KECjdCBlx>nJpeK!jk>tRxjn5;Zl#! z2nrRA=Bi4>ZZPBTT(I59mOl)kFx17#V%LwHczTMlx zl=Wrj)Y=4z+Od|_*0wjuNTZjW<0OYFH?S1=slN(Uq8U< znbb^9UdYFW zv!}jJBUQ^)e4mdMJ}HT-B)>%X+foT-8}+2QE^yvBy!ixqblX6fH6gTTZOP)eM$$Q*DX;aHrlU zQ>He}Pv6o$a=mO>VbfHhQE!Y(Ji+qKJPj~X%2wx)bu@6aAym+ZbvSAE7}wNcl_Zh0 zdHbjCO^&`xg(^RFA-d5sVWl2_MXEJcH=+Y8PUz%Kg`N~c&@D^1v$-OpJ{DyN_9eI> z&93zyq!-`%pkYzY|El5yf3adhE@_bU1wG^|wfGO_AU1`BB%|+pSQ(SkZDW%}Cz#Te zD{*}VLV2&nE8-vZdy8;g(9Ag$>_d8=PkSq`hoHhOGF6nBO1?f?ldx@MzQETfurZ-Y zA(>h8p;CePDv&9hwcCY{$-M)!NYT@TU31NMrW z0tVQ0ZqAOOFClx^3IF>O%f>l1-}#-6r4I@*C{3X-da1zy@cJmcc`Cx?~9eFQ2LoQ(>au@LDEGzdQpJCu^nT{P7L?{7TDUY&W`rkZ5_fDO0Xs z64nsE_fzJehZZf(20uTx-nYGd{zY1#;?_E|pVZn>1__H$M*Sx>5d@bBrA~(|SZ~+y z<&+&|(wMJay0s&|iAncQe(eG(Pb*IS?BlyND-ZBp-X{LEdpA=G2{q+kI< z^4BMmnXSF_*JDvnKm1IVu`qysTvefe*MOs;!&d%^jsHTHo~)E$CQ8|r_oZPaAohc* z-bE>&z5Rf=&WFO7DhMsy&pM4f3DMa)!qGw=vSG-*wq+P>Fxoke|9(1GGEoTw0~fn; zG?xhri+6HzOAvL@vM%(Ph6kw8A!w{Gkk$%^Jfxilao0Y+wTscf!dmqyo6D}gp}T3+peNLo(0sD4 z+1EDt)SPWp8fYawO%kn2z>CpJnlTTs;BzQEWWqT4lS~8p#%GEC2O*t)gcJ%yRwH2P z9+3(SYdCyLVI@jA=lX+hn-iKMtsIRV8ch?TqGapXr5c8Z!J}FE+X$k!4wYQk zAZq6)wc}Y!LSP-%0`zB|o$Dazla?s9_clJMQ?Z(#zkY6~gdv?gf^WFP{Hm@c`yJc_p%kP<6HkP4t1BC0sX*xD%vw{V z60NFMbvRN_LchP&V~__z#BW2q@I(a6%)0r%r)xymTgiwZQ-sJWWDW^5iZ>i#B3xpx zb?MlPcA)n$+ayj|cs8Cd-Xw zM#qd;0W*(p1CQw3YTH z2FedrdJZN!Ik3OPnQfrTm+G8^$y|@fZmiRTXK3_DqwawiB%U9OGS~3O4`nAMI7wJ_ z))$fWcvIQ#j7W_4#9IrmFffmk`^8`gqw&{P?HWPc0`YMh23{B%jo>W6zRq4I1=zqx zDUZH{iE+J~dOl-lzu8k4`WWF^9Gt=bwG(Ij%KM@BC2)%cs>WLOqJI8}!QcW+aW1Tc zi>*U}z~k;`1cJw@C`mY6A7xk}ZUO7mp3hYDu@0Y>GIBv)5*zjHloztE`tIa3(a_rY=pFEtH2U9%pCpzjnW~bY=Xkj$-o9$8-_2& z{-*x-cv4Urw@jttB5ibL*1TN~_n(gMR}utRjw6Z!OP5wfvjlr>*$y4+cQOT(Aq=n+ z&3N*Vg=A>Z7|V8ztZVB@zoD_xw|+D?xndY?mAgWLrMzpTUUnQQcIeaN0*xPJS=9Om zRwmPOoxXWn!60&WXJNg8jokc}9It5}n&H=hJU2v@%M!lQS4@w@=+|kY% z(r2qEb2ziGzZRbYVc#r*)puPtAB0n(KMWV&L0`i$XqISyG;4Jkv690*x={3LjA63) zzqp7hS!TB3a8R0|!K5Irf_S2!fP7d32CEcZlQVFtD@{_Cg~8rWJi4a67ftgUxU|(- z#X+Q~ksoU{4v!f5w|qSIaQwT=!~Ox6d&q zVyIN26PolG%J2-gD0pyzJJJ2?@Cde*z-DnP*jKT`qwj{5QoW~@w#&H%=Gpx3)KD05 zo?xobO+S)$`+(jnA7=UBU%EIX-hL}vW24S;dVTk<^-R%dhGxNJ7Eo~5h#MMCQ7q?c z-C2j)7S<7P7XBbq?G;{vLP%)8*pAE!G-%#7V{@P8*bpxnNq_w*eMBkp*ty7k1){j>%#E)O$p@(2C|(3>xHoW-k`x5E9-;qzrDLX3Jz``P;`Dz zYTqqZ13Z20?<~mIENksZ$qC?4X4hsCrT!sCCQou5dA(s~<5c}Yx$B#A*USfzCas{;RNczq zAbZnN270aR^L{?BPd{|me>Qz_1tl{4lXesiyttJiAJL_=nP&*v2O%%;;>6)hSdQe; z9G=(-CLX&_GpkShd5F3vWN)@uw&51Ka3g2CfR8a3E+s!4@sSSC)g)hTYbAuIZJ*LU zo}P>xp$$FqR%XzCfadTC5#_S&UUZ|}uzV>LdoRVCVBCR>+W3>|p3qCttxTpWH!Jl3 zn^;b2tLCH#d3Q0Lhe2#_O@32!ThUr_^C&bdR>g{2bxu1ORdxx9%PY#XZZnZzi#@oP z5r+R*;Bt=S&((mm9Ug~MtcQneaY2m-4~VoGeuf(*R4pHAS6pEHGSjpCJs!0RDvdCQ zGlqX+kKo;`7RWjOXt;Em-dJZU{u-IXipq)n9Q#-QTywwB3KLIak#P;-jIC2;U_yO} zg0E4@H}CxH{5Qc9ox@FYF6HQ0vQTFsmiJslGV8Viy@HP4ld%`td_ppnQ5k+IeH%1< z;P3-6Xgiy7#Mk%c`x!bAyL?DkGb7&c2Oao(UZ$&56)_ml9OvDdg4`b#xY&ANgFgJC z6Ub^aK7bkJU}F7d){U~Shf&9>I9#%3m6zdO2A6RPs`eNIQjIm95qkl9!_M)!m_QWg`$hnn)?>ST%b7aZ`fFhrH3O)+aB? zbu{$MRmt_dJqvcN{rZOF@T*7bi*ONWbJx@2(aC~;m?M}Sj^HKUI0w>#I| zEHv|S!d!oU?Wy>o+hD~}B|291>ikX<3(2ZZU%tT$#$elUBtGz%#n_A`{_=|{jVsYO zkMBP)NMPG+zgoHa)6nN(ZRQ-+^5Exxb0^3;9m%Z-AfG-i-0d9Qq|$9_z0DOVUj|5N014<6_3yCa%;&Y6*B z)qJC7$5++b@6qJ@L-kF=i%oBtZ}ZZhJseCDGRQQjF%;{S{E5UlDu8cq?uV!i zW~ycL2!}`~pr~2L|MSL&Z8BT_HW4IwIMN&sbh7u^FNBQsp!h&E09CD0NoD+-GF)BJ zL-OP2SSAnXb_(wZbID2EVL?~7{65xwBeZ$Kq#nKa;@x3DOZC0_;9jd# zFPY9nO{BZ*_Ord#UG?4N_MER-R^hZ~F_{)8EMFB47yod$8oh+}!fTig>xn&@AxM{g z@RLZSX8R}Ssb!^RY1^@ET-IUS>aS0ReyYC4etpoFQ0@KQuLBJ8S3{o{x~JbolS5zd zSEh-<0uC0?t@zEcoHFah`JJ&NVV#NE)Ia`dWQwZ)tu-IOH30#U-n(Tyd?U z)1al+#%{(_Nykqjq*_5i?E2osl*N9pY$`N74Osw-?@LyRk8I`#7xL)O=E+(G&$H6S z2+cVwXWME#MaO0}T4do=0|z+0==hY?4D8DNE(sk)_k$`r=UXhvZV%~EgvgJG%=Nd- zV$pDT(PcU&k2PJUKyc_%GhRpS#4KULnc&g@M2l#?`j-kC!;SjFNxU3SIg&^PNrzWQ z=9J+Qqd`5>vBw`?ro1jPe0OR`)LmMUoCSxQ%znM?pv8K*sujqDrkLKzNV1c*2Z{6} z=$7hnK+E-g~wytkCw;q?SdV(|6--)4I>T#s^ZY-I)TV zL(%W7urF6C^BmB)d&ZxCbaE$dszAvrUXiza?OtAFTO4B*ii5N<`b1;8r1V0qDxn5E zDOULJvN5Ib1IWgfGjGLHf`G7mfnlP27gM}_si z1djtwthn$X=%L-4Dg}NpIxe2ONE2a_!Zf=LC%i2p_2+rj_7`n+& zY(<9GK_vrr-6_OD3CEbz6Vp9V4(TJz3-(nBh9h?q-q9Q4l& z+rZ`Y^l!1?9xKRcJ2Y~mp%j#ikSwy0DQQ1eAvJoqQ|6_n{<1Gr->xV$)6l^nAyTgu zHNe0HO^}~Vyv%ihq(m;AScKu-NSAlA2-l2d`rhn-U)7$l{rLI};u7ByuKl+7;~vER zL*@N58A_ue+>btU&tD5W9Md)&ihrfKVC`C7Jd2TpaJXxD9QhJ(bR8z7L+z0x48Ar0 zxySYG!yPmZ|7kD3u6$F-GbO7;7HN1gqJYnDd*)rRtMi4qfD}u%KRL^>oZL3vWTv+q zy1t6fE%(@(mSgGuLP7LlgRpjTGNFOSwFcZsmQ%Poh`zHY#@LGkk#^)`z8B&gqk6#f%*8?x6 z_INc84e>7^Q36`E=jJqm!u;Fx+Xb2gcaui$n)NDbvK5RkLui%|dT$}yh8sy78B*nF5jIfrZ0-u8{8N^BXaJtzXHaRXyCwUv zsrkfG$gb>MmLY1~g&RLEH$ZnS`-BmCH0?(iw_gz}Q>7fOu2-Y@&<4aCs^0G%N7a~z zZZ+GSIPXTx!jqE=16<5R-*ToVSFgO`ka@%fzdK|&ShqM>FNp8EVSwQOk(%JmAb1}| z0M}K|9?4eE7lZ~e5+C6&oI4bGEFs<^SL$*WBUvIZpdXj1brh*DTA5Rvop~i(0 z;zbi2*c={@2h%faS+df{jWJ-OC!Xh>tsi+99AFL=&nmV)E*9SI5nD5R3H4K98s>z~ zi`?8?XcPT>25p?j!6KT#d35h$L@YJ=L}qtILszTz&w%tDUocGrZTm2CE6vcbY#Ytu zaA7;mG3_;V43hN2-SewrqPv`t($EnSLe5=O^zoC+H2c=+Bgd!MSgXOG(e`?tY6o5W z!lXCZbT*cwQ-U+PbCh*|G3aiFnY<$C)*E~bvktnLcq*6&99Q)o29?9=(-rwAX46jX zMU97qJ1kgOi&4bjCA&wos)}OzZE~`iCW|kZteeg*p+2;0w#ND`ZO?h^U_)2%tG?pt zBWe|8Q)~FM7|&Pvv{8MWqnd#?WJh{|+dR+iRKbgDFEyVT_!m!JO=U*UY_pac8ICCY zDEf9OL-D0L$FdU7@oVr-F9W0%XD zhsxvP9=#Qp;a7BeZkmyWO0w`sOEPO*D1?aUsLPKK#FETRIMm!{wF@Gujc5!te;gru@E zOBqb;p*5NfcPdn-x(rOJIS@3gUDoWAN?AtmlAF9UTYJa=JAd8iaW1Aj*t8NGhZ^!2 z#t@gyWi1O|+uRZQKa9P1Jk@XfKb%83M#r&7#yR#Dkc3BAtnc0zfU++HO@9*(@+>iT@`=8I}Q5|pZb6v0NdadX4^#t94mJ}zM2YTS= z=&5!O?u)Cdhy1Gf`J9kwm97GJ9qE)1?la`_l7J|Iw)h+L@SBA@tqN%HaJ`<1rtje4 zd2dsLnAwZ%UM_sV6mYW(+KyOt8z12Fl8=o*5{4zW|>z|I`tpawXHUqI(o%FiY_t_^ZdXDl&N?5MqpeCz;O9z4F}`5388gbht^4| zc&7soS|?1$1a1n27JJ^R^A@a=Vevu>ra%nFmFHtH4JO9}Yb6==1y<(6G#W4;4s1jO zHSap(hQ%`I-YK&pqZs8e@U%h=GekgTD<+Q)Jg{?@SEZnxLpaNLV4$5tZi~6!R98>o zdNo!9b`Eq11d&cDm-yhW>R*Tw#Q*>89MBUv8S`)3%LBEpP#-3+pjLppCxHU*MhZV- z5C^D`?ne{O6H(DViAI*R@CH?zr7Tk&P)ha&yQlE~YxlOZn_4+QArdmb|F19MM+~-) zu5g_RW#b7aB7jBgu%Qt40EVo)!^9x(=lN+8u1BF#H8LsDMg3K+0E=Ba6b&?^Ca4N~ z^;d19#`sCviW&+D2Rduk=ev)cflh@sKx*oB1!jA73nm?%pKMt_X_Ez*f9E(RKlQTw z(7>m@c@~kYy%KwH7XE)wecbB;xMcX5*K9xdTaPw-}2A*%l2c%ThX@_ z5~IcJ=f@~OYXhu6!6-1z^8J0~U*HcmSh)HSC>c+bHnkm8M{TI~H|hfLqYsGJiw$)o z9p*z^8zM6Y|Ig2>Qbfp~@1&V4)PuE7TRd79T|uFJpH{E9f|uOC8Ua-q1zNX1tO5nx zkhy6_T_vdMHwq3^_W7@{^LsK)zGoIDSa2+F0FfFWI+!(;(JaPomsQZuGPdRo5 zLV;be-7H>z`3WD|Y9`pi2!!C-<3h^deOCyZB4VdNcH7CKUxh#eEqXIg#gT0^f* z*zI%xgatIJ(4hze`;XILI@~CjmH!-|ZV$DU8DTnde-}FySv~Fqt3zf*06W9X1E8fY zDEVo%0O6aH5z7W)JaDeGFSX*tzz1S!BZR{K_DgmZ*{t&tdlj3ge^sZTZ3J@SXaGkH zHjWlJrUH*qN)12O0jO8MKrrt)F1YxBPHK2mI4`Fu7$PmyKfhm~# zN788y&B#Z8RRtd5%`dJ%TJZhwG4n+%XHJ1opUDs4QSlmPA3h=xXwZY&RAWHkc=GS9 z5S$liJZS;1VjcMN+T3K^c;SBs;hYRl6ANmOViN(x<&dMSkd+^K3mL;D7~;TSu20O` z;fDw$a^g5q$J+~Zbsj;P50Dj*HZH$C@)-Ig9s$%%>SPT9Jd%_Sr*+v*;4q)JuY`aN z^P!IbXOHWC!-(n|^(`FGRbFa4Hs?^7?~IjzNB>(^XpgG@MGY$d%;+loCCM((h5=*Y zIE|Sf16;85yYqury5K(3T{;HMxuoUD7?FUO|MSBGV0RPzS^w?z6#~#8s%`+yf@KD@ z@ndi;34aF)C|T^<$DCa|F|>EgeCdk9puJK4Ckf^JXX>6Vkb2udrnpGNQLx)f{1Q{8 z25&SL-T`Elvy4v9$MVlJO97?FIY2S&LHd~rujTtyV=7@Ws3Ukhba6Vw>nHS|;l_tE zsBAqP3Mw?wzq$-O)m2WO7CP{(GllsthPngOClLHr{;EzbwYwbzCwKU1Du|np^y$DO zEbe{8rR!1b8T4-n^3dVoRp6d=21jjkBNpdk1NlF?{SgoF&qh}xz>G)vO)#s;IZ2@L zrNzYbpI_D&2iA{1#M~H^u;Vys1!eqYDNgIZeWtuq?JGv$he&B*2328;Y%CgluUdCK zuDZe1DB11dTw<}%k^8BJ@!bb9;4)|DhwZv!;4V30xn3Zh4cd)9ptDs1IysIQ*_^=o zu(NgRF=Du>3eA47 zfI6#BC%KwY%Qql>@NiH9a3mg=0FPES8j>;yeO#8@<{_l1&Bk2JIY!G~%t=Z8ofO!| zEP6YN#PFw@ro6jY~X7ps5EaqMQWb%u?@n;13iK4L2x6S-eCV{Lhh{F+aJm9 zsX*rpio6bfaR)-XD647%q*R|!G!6eOZ8<;s#1bY0sT^wr{*a2_u!EY>#{kurFL$=8 zJMp4_8G$Sg%{9S9lTTD!FLm~1PntxZuNwBB6`$L*13t#r^7WC4e`^hkAcFjK zRS-1S|w~(4IDx0_}KL@mL7sxd{%Ub4iwoCLxoL zUX2;c|7`vBQ^+*WB~!_-fQ`6DfRNel*k8B4XvvN{>_&eF9d~Eo{j}x5%zszO38-Q| zO51+a#Xk1fjJ(($7+3X@S>YITASDRePQGtBs>D9k{eLYyCY;(HNULi#0h)vbpo9eu zD~7T37J5U?L&(vd-Nz+WpY1+w|6Cpm6dpG$XFMKT`DuWzk3a40cr{=l9oN~m2mRY_ z)RCUh8-xI#WE7TK7zcjqFg}6P%*A$`{9?z-T_k;5aVcYL#Uj5Hf&%njHGwv%62jIR z1j=!DpW2c_pI0IP^t5IlKo=+lB%arC)tyCeq0rwQO+N(P)6*!-&$jIkBxP~Tflf}g zNVis(*q54e{JV>fbW6dlDZs*OFKEaV3Qn#%;96|ek_vZ|1M9L(R_jMo4a177K;b5DT+QgX4dRvL zfeTmifb)Ktn+0&KcQc+#{Absgf>6i}&OK8}1A%}I?7sxySDwEPgmn!ZaJ_RQg3EYo z{IKotoipez_r>kqrJ;WV`KM>IhX=31Lcq=XW)yOe-$xvuIAq^t4onvKcVu2DfTUqq z+kq7NO;QTsG-o&R|7!bf(%+N>QScbBoLn8rrOdn6EWYii^Lqf24p&yjtGB;f8umxE ze)+U-1x~yjg|3zFzX6B^V{=4~9aell4&od?KDLdJ|HT3v5lXYOky41TQ__C~OBPW_ zj?I`r=iMHd253Zf6hDhdgmg@_&tw%bwe{Ak?{ipqjPylcHjF7 z1OL9*n*bS~{I?Yc-8^ei;i5}Ga;#U6H)rhz$-dx#ZIQW;{Qg zi%ErN>wpNd*yi!2-`GEJ89)+R1^P_dA|-VwSrF>30u;zCfH^Qb1|h~HD3Z1;TD%D+m^PH#;=sRZLIhmeVrlWfDHrNrUu8WRo-zcHK_e?nK{J{D`>=9Fb z*x$!t^euG70qwAe3e+};{(l{uK}ePJwwN#Y;HEjqDO+&>E2e!ZLO1MqY)ar4P`%3O zFkJIohZ2!s8=8O%fah*z&a1Hz$_MN5FUSmg9=KM%vGC{fjUjet40X$XdctR4sQY`o zmw)k09&#x+A|8TH@ED*hWdhI8zC>m!%<}a|LKMY^$WGKv;5F|Bj^)l~j*-<5#yk9w zqFIgSJMvO~4ECph57_i7aqqqm(yrWlKjKuR#c2Mr~>-Tn(5%&OicZ^A6X72G|nd zJdxnb;}gg~ML<4<)dO;3+8XkwKgh;F#y$G2n|FU7ilJx^43mY6XW=N0Wkc;TAaAocJ8vo*fd%0;^K7<-`L3 z+VElYM|>(lR6vlCY2cz_?J&ZL$>Eq2z8V~>l~*svDv;Uiv)_aK>c1!i!;PdfC+Iw_ z3xE{k*pd{O2tgvAT2B)Ky|plTz}(5~W5argabi zvc8s zIfTRds7FmMqwRD_h^uV};v`z!%kv!tiPZ0g4j9Ser_7wg#$S1gq?WQeP42Xp-YCJx(qdY7_MT3# zD=P##zF#L6*iFAjtuI;!uZ;7XyEs4mCB@0lTE(8?ZUURLVsqFA@ot9P-(KBinZM#{o7Jc5gc|*%oPpw)i*gi%( z^n>{ikSLP72uk3{?y)b$V(}3Ys7G9jof6G~50}$I_lsP#4fYFn;Q^+tb~EHkYf$WZ zJYc>r0glW$EgqrJ`*?%`(4X|1AH9NSf)tbny47Ju`mcI!j{@|gh%sU@L!b)KWdDW( z0%xBd6d~`I>xS^&mN(NvrT`+J{B2V+MI=!d-y!hrrHlQ4jEs`2v&(|9E_oF35?P5|nO1 znGN8d_Ggnh>z`4DEi&V6#YC?VnhN1<1G=PLBbMsnw{NrApFUC)UsYD)f2^&Bj=*ri z1LoLS|4x3A8}D86ywwF6U>#AyZ^!^A;oEus@CCy*kg%tQC|RbH2b_GHdoFx3Pbg0p zPfCYZqZNO7w+_l0l>*Ax?SaJHAVH*7c8B--4JealCa3tY+f|4fw+C0(=OHyYGZQ4? z?}wJfoqk8mlAY9A@vQl_A^_`>UktWOmP^d$$?%-2fsuN=Upk8?PdqX0E8q=IjM*0f zR&nqrHEG&WZFp_5QyK@Q#*fHumt8Op#Q(j%NtV3JYK6PdL zEVW)G=}oh+12O_>$|&F!_#pP-lb0ykYi_j)=VySBn)@n!x=9~*zqi4-iesh`ncIDi zLiZ$wYH;!UUMC?v6c}n!tU1&9wa~gmoe9!X3-PYoslw7^#%5Bz1t${IT?~Ak%}l zvy#Ik>MZMWLt!AK_F`1G`%Fm7Gsh)NzqufU#V;-_K4K!_sR@1l=^)WpiC@z$cPZ4q zYwq$l+MT>*idc3P$G3IZ)OK0|NSsR>mj>Xtmr6>ZICr&Er3pVmUorejHqAl%`FeZC zWGprT-C-Qp{gg!ezXFf1GKQ3*GS6oMeV`1SgzPVYGObMc=Z)oA+vNvM-7{NaOfCX% zZyBzR#kU(hX-G|()@t6@kSAGBIrwcv=gS}SnfAIMC(PMHjTbidUQP6Tmn_M zp#%COb;>=?+(&_zmJ97OR`;hU-_^8ApMI$1hcc1IKt@p5lZ?Mv{1(n_%gy-%jNb`U zaV-AbNTFLv2{Sme$cHM5ToV*T01uSh0dAUfkn}&{^%p+Ac?FoH%TeNXp7G=w1nK1= zyUcZy25l&tDO5|!TSJ~X$sHWw!1bg3wgc$$pPPc3?LH`YEMe>k4J>y2LWJ0hi(@vr zkDPwy?(L=>%&1Z*j=7O8$LEVZW<8&Q>73kBWSCd3gc)-!nTa&PR?D zl|W#Dhcew!i>N6Z$aNn`nx!{BzdhmKe)8RtyDvhSS1ryd&e2}=-2bpv@f5_I16}oI z`q*43u5HF-Mg0L0S}q9KCma@jZh>gQ$}fMUDT7GGkxiwRsx+hN4wAKh08~TeN)l_R z3aca#Dh+QcU$q6Q?tyBB8go;W^uQ5NkoGl)98~fv~DFZ@}3@a355#Z4mSg{<1(XIJk#G_DP4vq>;z354LeFVNE`J% zi;~zmESoYCFqeM4D%vJ38>~{cI zv~l$zC>aE{wabqvidL?q(GJQu=BWpmwQNhT-cE+4(4P+P(@iLKmfcgt#(ReB62jBZ(aJqoqpa6cFQxcj zwdK29>bU(ZP4YTRPx`YH{woCMkVdax5yo+G{?~F0J8Qu7!t9r$-=vF6_eZ#Qmt`Z` z4_hRcoQ#hpKc5xU7T9dJ0i#9Mj(@wR+4Tp*fqY2}gL*BqX?dQCYfzH^bbv*mF5KJX z62pV9Zq74IgU%Dw3A;hQ;6*))Wq3mxt|qxY`y^Q8nIzzHb|<*OuWzxq!MBP!Q!&(uvH zG*Mj`ghkXcqNSGfem(5Ds>rP?7o3jIuFQgj+kTEGE3}jQk%&QCc^pV*3y59*Ed6@r z!ZsKyLBpBNLwLfLD#7}84Sh2)vQAK}O*$&{fSli381#J{`;D+^?+4+RFR{kAf>08P zB)pfGo+ro-t<#{K49`YB`T(kU4=n4>`o-PM@^GGJ>T#ae^5f`w!Km4+Cs`{sBVBt_ zvxuX(4kq~FL(7kcpLf(r$?qvJK4r@IN{%Q#D0Bg11q|l%b2g}mB}U>eoQou<{_pkv8rXQVv03_G;_{1 z?rQ{RPCxbiQy@E;6;;@rBL+CPI@QNXFYEqzxU#9ogt3WK3HNA`AFfB?=ig+&A2WY6 z^GPhh_@iQFh`W7EG%EFYNTiTKghb6QTh!hDe2c-1?fP=eLGjLa`p(L<#X6e0^KEhe z9^nb}S4?=!=wZi+IC(lz>RZQ39Gm^r+bV`bvr*pu8MDLvg)PHtxHqc^Ib@GnvK@hrHg{KvHM4F!0m&_(ljKgtRB~uVw2MvS@dnlccg8#;ZKd4 zXI=tSU!1p~rQB~{xDzM(`O>9!FrLJ*AL;cmCFOwN356-1H2d(0CzO~s_Prf@Wy+Eu z3z~*rZiwLh^siSF5arA;L~hmdG2S+%OcZ}$Omu*_xo|bQs(hS^#_a36GR_nt=F&Iv zc{6bV3Eve1%{hz?O61Ltmm8X;S29ilPqy% zR$*GC$!*gO=>i0iNl%U_hggr}F1`OM%NzE1!!e$E{c;kXd`R(oOEwLW@%UBlY~+v^ zE=rtM#?Joz!g%ybZD@{N9cQ;d4P==UTH=FA4mXN!iTiEQj>hn#^UxntE@e1BC%?CF zwud+gtv@F(p1k0Q%z3(>6m6DPRZ>+17g2%pu{$#lc?{iIAE_%%Y>Lva*GPuC zxSS9eBEfF*kW1ooJzY<_m1v6SA!4Wm`TUl#WrS!FVrYyNK{nG`T3Wp*lza-Oc<_0! ziy=z6_KL^HUGW;sOg7^mhe8*s`y)AN;*?r%|6I$jzO~6_6#e$m`5L~zu!U}jZ9+sY zjyf)EVG9svd9J#@Z?Xz2AzRMoG$}IQSGqR9^XS{a)qXMJU(e^h$^4ANzWN(r=G)yVbHpo!#?~ z)Q?2EFU*x?KOMgE1R_mI)oSVycbTtQX{k{s(H+_#3tH>NZyPGcLiIPXJhf>l`W!Pt z3!;A5W@ugF7oQy2)thcO1xa>kCy!UQJap9b>)%(Y2-$O}6TYP!vDx1T;DFB>gp4c4 z=9k;Xr`t3dMY{~Hyzo{btBEGd{+soWT@rmNIZEs8i`@YSRa^lk)pFCOkh0zO@ ziP9!N15_W}w3f9^P%%qFwk)?8Md+f2wFo+KtSBlX^hc=r1^CQ#8vn>%!?=U;l7&mX z8L?G>d;K;MEePt!lCvrqc<#I)>12cP&II|JVNP!|;uY#9{SH~U$&s26#2gtJtsbqf z{LHkH-+Li<+To{?q8UFnRq&UpbosXGdIj%V&@Img4PYJZHDga(fdE-o%0Ec@& zGXp|}GewL6rK=WI-6rkAnKPHVdYA|EUz5^omoWu}DrNOB@_DW;J&RG{pK$4*r@9-#Ep^(s%K?V84#C%z% z$@r#>CkoLyqvO2Nm4`xDUT#MGZMyVuQMFXcKBm$J?DF(iMMWgDeQpw1vo$HM@4uTQ zBweFADXYxESBL7re89hyQa9rsSi&3nz1XfBcSwjQD!~1(I)`1hYNQPN6+8TFEdY78 z>6qKiL0zwuAN3;q7!YGw;WD6hEm`@DfGkB=K{TgizU&tpcVu5uNnzapFu{Kd*7}J; zEuiM`X=6k2hsL%ZM*l8qQ+wDbulLN`*@GG$cIBs@)1jTwz9nA+I3q`{&+rY1f8Zil zQAZ5}7G?InEGfMl1nQZ4X5yu6%z++=D>9iUvKQ*Y=Oc3W;YGeg!YJe zeJ#YYk-qF-E|G_G<`}!dtnUwnK(*N$W+Tu025s*yJV!@e&G)ibl%-OryQwn$W%)~| z=!-Z;FLj;wZ$YbiQR)(`;w#<{`Bd)m+XYT&{V)})3{{H43D|{g%rki^vuZQotcM|PS$%=664VrhoH|1GRXh8I15z@E zmMIS#{{Rbohv{ezhrJIKD01l8h5%ki%MGvC3ZG<3-+7@p^_n(y#pH<>J0} z-P;wDFEB<)DdG3uPX;zDZA zZSuYF>j|FNQcCiL?w#j{tz4g!QEG{6JBDS(U*#fyAU{w>b6!|m}i1%S;qkz+a1-t2=;#KxbZpAV@)+e%%9vvBacM}Zz!WS8Q0naqi3UbVsf z*BQg1tmL7Z2YoDWu}H#zxR7$2+a-%WbRGc;+F$T60a!{BWAEvKWqf230bl%i^ANgx zgh^|=RdcE8dT5&Zbv%+zd-ETrf(~4}5y7kN6$kO88A`YD@w1uESM|SC4nFYRmj(W> zThRs@?F70F1AVmRSS2X4MbeRhW7QpHVtK+#U?fRl3%FjkE4;IW#7M;6mds$c386fEhdps zankJAAPYPCxRK4#k8tgWNI%sgfNmmtG(FLlZJ5H!WDxSYQPjQ75{E^Prvc!E_-qdJ zM)-J(=b)%QXfIbB3a>>BiA`8eWr?vPS7>0PAEo)C|F>!tBqvp)VepQ4F*7OObqrM6 z^QvKBIlbZ*mf6P@N#m)W5;A&pRI10{d!yOQgUk?vy-&ZGt2a|HV|qH~o?S73!DQpy zP8Yf4H9&DHD0OMR?Y#gAxdJbha?!|7laf2J$5*;2J}_xj!NrA1egcSyS1FU7-i-EU z6lgQte8jt|NCN7s%jWz_V7tGQBjvj`Ge$8qyv1+Lv0-zD3JWQ$2lcq>jD*xTBZt2r zxKjO~l&els{~LW?YsL2ktSyR#RgW!&LVk6H=wH#Z56IrKug9g8__zpjQE^PiM-6t) zYSsmfqP?9rRg;H011bH<@L`$JZ9ffM;{LByAjBhdD|e?R{<$2D@+gx6ZM(fscuK8t zALS_w5JCu^o3EgfyP3PIKSadFe7yUqKAmE*w0Py+R@=$$ivrs8xh;TaA^07A5uin&3w6XH^1vvD%GwsNxhu1tHrExz-l&10@u(i*sU5q+!^ zY@}Au!#A@w@>}twKylY$)@a8I0=(TbLvGz&lCR^`!h2P!Bb@y&4@v-llD{U!S948H zK5FfvOzxmu8}ord~2ggd3n~VCy@yLUYx!%e>@!`V!tN=9~r5Hvn6uMe>%Lv z>$80B=y?Ig)MecW1ppvlwSp(nwU|EG1b@jnnQ5;r`Hq!`p2J^^j%I9Y_m}2{a&ECs z2MxfFLkgRZZfe369(MR=gPQkCJpGOSLz&D zC6?X>Lfxk~;kHW87*rB?wLW$|4;%u4#EU}_W|ceJ6HdN!l0wqa!a$|gj^)J6Psxp{CVS=$mTa7aFf^NdTrKzwqJ)jMDSd0?nIIO+JVI*m*D0ij%AViv_4LvMgq(?@wS-y55->Pey*bTctlD zzX#Nb_MR}eGlyLnr7^m6hS4gV4|XvS2{n{0{jHH z6otTsD(f{*rl_U|o`AYP;6``nU=1dX)^2qwq)R{DgF1M$V)g@An%g!Ni!>s?>TEJ| z$afs$lNZU<3D&!y>3j84f2Xt+aYh;v=sW8#;+Xs7&5g}82=pH3AVV@Y6rVjgR)NPV zk@v%sdJ_3+a>fXo*wFB-dk@cFlJGqaU{D5Ck`)5H-uuB9_L)=ff z=!JTwhCUW7A=6{sV$)j%>87k0*p-l=p?Z@bWxIcffDvL!4U(JT{pIW4e}HiEba0+N)22#0+(EftATgy4f4;sOE5C-|(a zxyjl$f=iu=?#qbAalCQlBKsx(c}ZdEduVUNzPH8i)ro+@JjfDAVKY5u2Gi-+eA9}L z59lu|%wm-~UkS$?b0^DoPfEh7Uf8y?ezg3RbM_lEeN zv37?a3dLVY^)6L6=g$l>Y)yeqjQ0uDsq~ZHc|hV)8QM3`HlLLge@^~&92&0BuvSs| z$EI;19hkfxH9@Baiq~?ApzC%N!$eudetqs)f!XU&?|RTRcuGFs5?@@=PAM`C+2H2i zt$=;N2*Z0iYAKaT!fojAOgggl{1o?Bx4-?>olAu;TyV*>x83Sg8VgV&yT{)$|K6#* zf!Zt^n2M{dK_TK3GShnEFAaksvLYujeDf_!xtGA&5BAfRl z80FMs`mf(64+BkAwL3*s4>RegC_h?k=&d<;D!hIK+)E04atJhTFFYoaCRhQbg8fc( zD$qY-660a@Fh+@R~@1>R!zwoGso}avq?sYdQ^s5$` zQyMn?Z|U z!LU?M{bjvK)i{jCO_QOf5glH>Eht2SBy3T5vXPtY; z3uF1_C#x(5m&t~RO{-F^+i|t5@T1=zpX?9ZXq8i)l88`$Gb!Dk7L+MzDvgFOFfUpQ=(9xvWO`+!?%QD} zH0s>)#2G0h`@auuDcq@#nO=fuVN2}AQ$ zDRxiyhVFS4wCn(E%~Pw_Wa-li<@!U`d4J9d-rOhZ?8wcpi931iV&9v-)->UiIZ%LGUu<~bFmC8jG)zk)QXmfw3~ z>B=>c7PtiAj90(FU#3GQG9qy8c1mA&Ctxt#PYjyZnMd7P&aq1kRyPBeN?E70$Ag8N zU8j9Z;lmWH_&xF3wft3-UCVd5cX)%!BH=t|X24mJlx?=r!E+K<= zs4E03Jp|1!i*zt3QEo}E1${cGXHP58v&q~4UeaNch2_KV39e?>U{-J)? z7t16WbJIQvS*`n&>*-<+tuTD$6xYi03Mn~KTiHf;vfQkDbjzjIb~Zn#ey%j9Yq61(yITi3iZ3e%VL}*3HX%ue;^O6^BxH7H>3Y+*oJQc$ z@0D}d1cD^trXe67aED{rPmr|&?Y-)xO)n{M=GI1dr5mM0^Ta~FInk5FZpw2~7~!1y z_ZH}s7%PTTTyi#j5cSOC1JM&4+dvmn{|_em0vQk4(a6kN+xV2U<1+nj%A>{nf@ zt8*%e@XG{UCK}fLA)j76*D9J6pwX?#>4^%cU@h5|@`~E7jc#F9uwC8%ZhPi)RC4_V z_x9O6^AW;v>O>Md#RB^eWA_%{GyIgY70~a{%Qx~XYt<8ve%-Yf^0;53+BtIYhyILI znS)%)6N=6kA#{mN?=4snG0aM;_;^9Zox*LuKzG6nat$nY5VEh)UhBj=0y+l5WV=Gxf-i}RIvThzXfy{ zWm!LZfuOX+Gmesm#vL0E>msOxkzDc@>Qr)+0Xh3C9){C)eP+-=bNg#g1Q4i(UNb%D zIK~W(_%|IlikDR}xFiD_)Ya#&GQ_pmlMr{OY`TUI{lG|KHr1Hg%-ZLyaw$K3+I=eoY|Z)mm@XtG;-Ir^{Jh| z>ejfz7MlZnET~&}eScB3&K-f75zpG^GIUWywt|Vc)Y}{+@XCab?V(_NvajZWS7*d!`_W>J zS12?H4s-_xO^+ilq1C~7p9^fcEzt`J?(%l>tDe^C+H6D$i8$wM{vgT_S1dREVRBqn zc@50kq?B9Jbb@}vs=e8HmKE^cVB*!>vm9+kUMEhM696rEG4?~ zJQEZxr8v<16;ycqB9?3pEss_;lam^8YKc2oH#>d`gYE>q=CrOyC5^XP8&$jzAp%p~ zEe9K+vT-pRbzlCZa9Isbg4`~0%J0V6E#iHN+t=k`o>e@W1(R=QM$=Xa zJm>j=|Dn^$a5vFWD}FBPSdPOcFDUz@*@fJMVv~k~weFhpY4r1FJ??Q4*HE{UI^H?J?NySK2`hC8yxx=k z*>@M<7kjP`IL36dlB90jyt(YB__ll{KUu#4E#kKGy)>eDHIpZa#m`P(p5$>#PJZ*p z%PA!v(^A?g?`xKO>%rWEu0C;-6~O~=1h04Qyw6$SK1_HK%lxcAIW{9lnnlGXHk^MK zY_T;}E-%t7urgYt=lj(#z+n@-VZRC;-fdUuM6-VQk@K~rF8t|S{b#dBQt2W(i$wa0 zme^PBNxu5s{NpcpOZk{xTh;U29Ai#Xd_zvp^5LRjTvK_<8{HJat!g(PIes)~d-m}M zzMiW4<9Q=9IO5Gv1dFqyv1``X8k^Lk+ThnBeQry0ndEIlZE3bbo9pr7Ugfg%eBWdz z_BMt@EZm#E`$5j)_1SzwtTCWT{HF<-SJQ-zhD^2wgC# z536RlJ24VC3HAm`8rT#2FXR|AoNZ5roqqk%?&>n-07rD=BZ;cvr@N2*aQ-RthUb$U zc`IK!R>X-E3UOg8cK?DyE?C0|KmTjkfhMj;Bj__R+nr*a50T4y*XSR0i@O50^+_hF z8)9#nWz`0cD!23a{e5C01%q^o--)y2b!MICY;{qtoBfH=jeRbr1}ll5Y~Qtlc-kv5 zxF((AgU919rDP(>+8&jevV(i4?O(mgk%@}z_z|k9+!W~~_R7;i_Qgo%GvAxr;(gNP zb?Fr4I5t1~;4NLI8U%$woOy)@i?L{FUR^=0Bix__sFja$9!s|yFkA-{jCp1_POnX2 z$L21c*#8Z}P9r1>~GKc-wZ+2*0F zX+%<3pnWeP8BNGZEQ_|kyN`FQn4;0UJA3!kFh~Zms}^6GoxXI#mEV}%K+{s#dKWxY z?ED9GH!vZ7SI+W*!xacdvK%xn^~5OXaDVmSXJxj2j5KW?aTj z(95k*Ch~CDhswXofGcW<`+maQo`Qfd2aRl7nf7Z@Q5w-CrU3>6Tk-}yG+&C`51K*8 ztE3s>(bw_>v8t%pSw6|v?5nSrXmwZ8j)RE8Af~Cd2>_TzZwJSn zuR_4ph?}KZ9K{5YW6`ytU=H`gBl8Pf-127}(cOt0 zgb^Sy25SN40BM7%uJ`r|Ys;0cB7VOb4ESJ<`+7v6W6I|e`Q46sv?Y;0SYo% zhbrz5Ya4!LQoXY*#p3sg)_hX0*zo?t!b}3Op*a!NucyUY>^yVrLTr40ln*-*?PyP} zV993*dm=-Oa;u+fN%mAkX!km)J?ZIc!6Jhs4&8`VesT>`RLT9hQyi_P+~Wb!za)OW zc~C@w5p>7@TPra#nj9A`QM+elWfO5ZjI^7uM>`Z*ZAO6pQ^3=m(Q}mC@1H+i6yA8QRCdi>2+Z6h{`yQ{ z#UK#0l)!BTA`k)-7odS8#d!zQ(?)XfpZI zzK)}xL=6#z2;-hat-gAmTED{2ty&#QLv^?~2j@|@lKdm#`#EW?hh3dBmhoCCmq;G- zo4t03pQw!=p^%)c%>2z&FItWLD9`d$RT7NiwJwSHff!DV9$s#!lnsAIbwBy4g5Fz< z_x(M8m15je9-OLH7yCekqO^l>Og|_;<@El8@DjkjD~BKCWamZ}uh|NGv39R45_DOt z&8YVPTpYP6MRE#wG6PiUyx$#keHP*n%lo!IrLkaIo&r_GkcxM<`KM@k+IF zUhkNEUtk}7R{4;{Jt@BS;NwcFyn4^dU`TQ+865t>UgItpNAk}!P2oKqWjfJS;l|Y2 zTa-EyXb2>1ylFdh++{l$DHzKIRT<79!h8TFEP|P}LpG`31oDocOQ;Jx6(tD!+4O#$ypF;<; z#C-MB6W6#}RFO~>v!=qcFO|FtVKMK$Gw@fsmHe+z4u+UuRLHUP${eO|L?Kcd^o2Q7 z!NizZvAc8p{Fwz^c8CA@@ zG$5>&fTCcN0iD`CScDX)8x`fuwaFo)!N()N%jP5bfJSEGOl zHhFfXbSD8q=x4msx>)0fK&(;#-{+!Rx+X(7au^6rC7Inb?VoK21W9KIN?(V9_;CWC zka-YE395g9-X=m)D?9R`G5O_Fh^J;RlmnPSm7~@FW?t+=Lux~=$UN0r1%yf+2AKnfx>wyf^T;?WjxWPvZ+u8LP{l2ikHw3A)KY zYu;P8fRgdjhN*FlrhGtVAz=jO9tc2JNy~5*TJRaLk{U5S7R~=PUjTcI&E|W_>0gMf z2VsV0#U~X=xSn|^`t>?oEl-NSkXVRkd(9CBYLwMlO-1<;7zYR_K2=UXn7RqDbgQ73 zp$k0c7Z1ese>C+7%w_UPFukIF=`LUazEs`<+!U6Qi{n=pnt*j?$ZjGj3EQ5*P z`@iHbn)!y3K+Pcna|Tf>+9fORr#%1zYm3#t4uzfXO{b!znE#oW6*=GyiFtWWg1Nqh z6iQ}*ljyy)4^)e)D9)TG5`cpfs|J-b=gR8F3Lp6*Z_uZO9@s=*=^55+d$uGLrU4N_ zTxAkh0{`7I2g>u{;vDo9fC_G!q&D>fH~R@spekk7if*M2cNP4GyB!4WbU2}BA_08? zu%A+c7Pn4XAxa-K2Lz(@i7_eo{FlxKvZ1ub0g2)1EFc?_1*2a3zFQW1r2&S0%y*oO zR^YEa;RjN#MC8!aZQiL*fIqKy59GsN9{zFpa`+F#9|0l8tMy+MRsOpd0J$EJghYk<#Nk07F7@i?P-DQQ5{O<{aR;cd`<7=|wq5LLq<} zcn-z)06%B|28H)Y!L4&)>i^mPSIYCyb=GK5e~HupVrFYALR?=&)it1!=llP3cjfO? zt#6;*R(qG&6s1htm{}xcwhfsw=cG)T$#7&yWNcUFdB_|YGnAo1p^#ao5JD(J2xT7M zd#Q82-(TMM4|uz-b6xGzTF-jc^W4MdzSnbq?m;*ikzv{V){^-YqXLW)GG4Ie)V8%y zILkD$Xsw!$M*ODZ*Im?aNOK|zW&|NfX1xT`=M(2eBX`oJ_$ z6#ZytzoOPNloZ*Z1I`gL^FXm8wS3$UiE0d;-qYAbD$vf@h%YVvQH~|n$BYdKXM_uU zi3r=9fndxP?rg_;CDo> zS41B_oIuK>6ZoN}-EyI$S3W`>u#XM^S@^#NK8y&Y=-V$Vy9x+Ay5Vq2+V?gvlS1VqM(eX1K#tS8Co+cNf@viCxk;Df=3wx>~riaCb`F21p##gxdt=Mh8QX zsPW4l2oklUTnFxpmFGmLsHM-)f5v+bpOAB)o1?(>XPkLYXh}$zXq4q;br0d;_@0A$ z*Q`~IxgQyAlT$EKky4Ww;syggCPlE00?^5BG_i`E*WSQw|**b(C<2QBYax#Lz}y*U&d_ftv-k?niuHGRDb z40MUj@W0Dt%PQl9d~KclvMAdGC!4yFP;eV4)=_?4aN@kly3Kj?(j6#G%!VUNJR5X> z2skvo(1?dNFhIC}<~^Rk8Ijd=TSoicqm;T(1(GzQ zYP_kfk;=565Q< zdKVqeA_{pBL2&PGNPpyWge;*ARPiWz|Ko*#A_YDL3)=%|uz{m?2WI9FLIg%AhC`Yo zE*I?7fQ=tG8m!t^voln)Qjp?~aO{L2MLET1gLtw@{X#`YE=+l@{b7fZdAx~<*;E&( zUN=p2sGQjx8QWVA-%~$+qtk zb$mtpVA~`D(-g5%*V8e=DUI8fjih-*FpUpxfSZJF%Uu>4SZ z8;_9ic+HnBzd=eqdw?+MbHCe@Vq{y%;iV4V+v{R3pumQI(Bpu>Qqz6?xL zb{(a(#5{oViq6>DzmUr6C~B=AYlzA`Kk{3yaxb9vp;4QaRCFI0j_Ori`Z462HNskw zTDFDo5+K#%HW1=0H2<1N2VoRM&PRt(J}a+0ib6;Zy1|zv@G%(_r$WHB44Ni&T@JCA z`?Z_}$hX;jQ`f6#0;S$+JcVW22of9Y4?C>lgS6iPKEC3jSE^hM1V?FvPNrvNYM*oN zKd*EeeN`e1roB8KETCRdn^6M*F}sdJocHg4UV{_`2SjClSZoYDdu}5K>QXjFd;5iquSosDpU9`%jeL^EeHuaLrH0?zcMOeC z&n$y6zpydjm|jjG{82WjC~Nw=!*TRdzx7cpkJ9K^_`&_HdL)PfSfejClNlYAwnO_O z>j!{_+_SxoU!GL`D=2lJ&7X*{6)@LH^qhT(2!I|M>1aStIc`;B@s8|-8l31}i%J_l zepqNF-yE7y!enfbSo+j2LEWn7pIYMp-FYhTHfgrokt5(mk(88l9D#?MfMbW(##&5V zfn$bU`ZbrSEFkDowrMHE)ICLfkZoI?=8C_FIl}JvbW~BXAU$#Lq#9zjNKisb#pbPN zdL8w_K6WD~N4Dp(kHK=2(Or*O&=wOyj}82Iw{9KyOqY|#(8%soLH%{-8>|{{;mw%++@amM0x~2BU<)jgQ22}3`hp#mncSPF{~Yb2dQUOf@$$rMNYYJx0@Iwk?LE`3ezveNvQV++{XtE~X~DT;Lt^yK=-Mx-sf(|Yr)#R{ zQ^aqdKa}`MLgn`M`qJe4;Mu;yU$?jH&CKoVy+xE{X#KD2KO8mrMNEg403*tUK!ov zOMQCNJlpZ}uI?wjKRMxXzW1%=5e zoH}RCoFwYF>OwV0{%qll{tMgKoQ`idV8PeW5x9kfU-c)cWeBF2_)d79HO6}7v2E|u z66Yy(js7=I6N)x{1qlVlH6uM!KLs%|Z#`kZ*4plvl4F_iXNjuTu;%B`%lG{(T4Exr zJl8xbC+&w`DnkQ$d7iT`8<1Ay>OpkHP2B$e{*kLWULb87BB<1oPo-Aj zF#^U$ZVMy!^A#1hzERtkbwsj0eDMhFPlC?i^d-u7L|`bWU~5zk>cDjFs>*0YcQXxk zq)N`toT6ZqIHMu4M4WaLye=0`$FH3kfN*BMBv2oMis?Ul^3NW@-P@{PfIBLNSHGm` zeeelML!!e09=(D`^ip>}{a=e!WK_isAz`>d_1%FUk=fN}{$xj5mL?h{z4$5bk)Yqe zG~GLrIU6EKsHx@3i4RE71i3GpE3;7?mrqr=%_rvElyaU7fn!FO$~f5*yULx+5+v@F zVAC({QZPwJgfn!oiW z?S5&0T{%H0D>o$Mvy)D%@tt*>X2{GyMl#0maT0@tEyZ1FHfk1+Cpz7pU27lSnbZK*W zrk!#Q>xJiLXFs%b?PwxoxcW{t+$7Y{LD+CFaf4rD3N<9Rj=^J3lD|)2?ju zEo$)*lkhkb7}_`bbVC*%f1^$8Caj1ZRcBD+^BZ+vTVi+V*M9Y-T>@B~iR_*#-N!D$dWF|sWMJE?K=Ro^irFI~A8;9zKerpLmR$O| zz45CR6x*()E>AmavqSLO;XO!jev8(S3S4%gG8Xk*wd;D-BDLHp*NvFC(m~G4iN}|A ziVOmXYKMA-0@y0Y8rf#x4%!JN4# z52MHq2b^!Sd6Im7r2WxZIhQ@#Z!NKoTXH_5)n1`*)l$TIHw#wU%MD+<#lpI`EY$2d zRFlqN*}YFI1&j(c+{KfS_G8!zAGqt2X;DlIQzyIy7;sryv7`3?TO7xDG&0fFMGBlEb;hK7ykVVkNrA*M(Y%L8Q zCa|qkUiowNfyXQsMyfKFUWh%3jgRBI-U5;v8Z&JGAEdd28}V`v0`%OVpW=aENy4#Q zUd_4^hp4GFHYHA@a2S+dW-m?v7EOIiRQIl3N=vNf(e%UAL=BFcm{TCe6Cooigyk$v zZt`DK9r4ucDoS9~vo0r{*UnLApgU(BG0;X+5Eqg{uI)sk+tM69KF+<8nKuYPxce`-#VaoH7vh7dY4 zl~3GU&Ql*mesx_1Yb!*Zapfot4b3CiwUgK`TcvPDNi`An8{%=hH4R0^HPr(g*=rng zWYs`VX7Rb)Nzp}@054_r!DtWYSH3~~@Fou{$if^aKp^lQV5dhj<5WYnk-? zL>03#epaBYjHMPFn*U`I?9zoAn6>1prcdr@g>%ju7*@#kW3Epd^mK8aY&%P>U21vx z*MYs!M#%070N4^fmXNb`=J4*35JJjaNeJVTD(k>&dU1b3U zO7xfvL1I__vkIZiKV6cgGFIi4$jnPlKKyKFOG97b^(@^y?Q9=8cKKJAZJq_J+Ostg zckh5h57o^5*p_^;=d<+9K3X$#3+=+FLc-^d8ZD8$a#@-qQfHczUzkWbJGE=Fa6`!9;ieq=zzZ!RJZr zGUpPl+0(V2C{EI^ert_S+NCTseY3kc8`YUvGj)*>kH*}(?CGos{BH~)3syXG8=3sT=-NSc>A)R6NlxuU8 zo4+xPL6{~w^t5QAy$<&UZW%FM(=s~4SKd2Nev@sZq4A;na8OIgYWB2|NoWsXEgh$> zT}ql`g$3|2KvXH9F^z%o5MZ@<@Oj3&#dpQ1sZ}fMAG|FDlo94FwESL^o5DjZHZ{RJ z-)XFtOsBXhK{)5)yvoD#B{z?~UUit>wV2=2EbfekyzG`VsGj+$!Ig!Ti~1$zXNL;Q zYSV`bmusTKdU7<96x|97GBwghv`qIz`8){8>Xgy5am^ZW|>XGNvKW3*(2!zhF^$4XOsB( z0y;${UR7^A>|m;&&;ygq>8XRPEeTec|7_7i5;P0ULSCiCr(X-ZWc=Y#@g8jEZU>%6 zi2y4*K>}hG1Y*TgvJ@Untd~C2#(WnffAO0{Cyyclm10DD$gdn8F&-qHO?io68WjHp zSI!P05vAh4A(5{R^3?7du0l!ySCY~9WaMFl070inV|X9$=HtJJzI*Vu-B$ffVMPK9 z`+L_v#yv`j0^XEf38mvJBLmYSz08|qMkZQZ&}IXB*fVnj*fV{JZ1E@i!E;2yELhmT z)y(D+*9ENFKJCFn_ogCf*zmr@MJF)4rV1ciGz0663WV{r1C}@`*yZ(GjMFr%ct3T4 z;CnI#*mYUL>cXf11RT-lY`W`XV@Daoi0gc2ZK4>MGP8N42pc?QT@a#;VwNu@#1KZw zYv4^-hh8~~wm#E(@__uLpv+-f-ZP$SKVo0p>{l7CbdA10slK4vCr4j#66?f9rN*iY zLuqD-uLmm-{L{?zFn;b-e_tU$04&aR{bd2*VR=Z~*uWfuU1s|(1CqD=IsuGSQDCT= zfx17A*X6c{aS7vi(|e@=)GcZ}= zj+m(AxKczT%G5EC@_voC%Y;8a+3Ln~$9whIw@ip?%L8)m7*ntytJBTD3^UWNBg zi09^st^|mVid3443}3VP>~2q{9XxvKk!=$|NSjRpIEyo^iXjnWbq`ws@P7p~F}biZ z2nQ2XPl?#F0q?P|%fiTTfb!Ibl&rtUY87>(pbpQOiof8?_?iePE`00U? z#4F6S=&^%nhzN(!2C)$U@l;!4xYz;NS~hdDaUbJmyA;kCD{`}sZIzfy)GfT$tIO#E zF_b>IX|tz{ux!z=#meB(_we{@q*{3!Tb;YnaEPf76VcF{e&x7*M4FiEQ>rl4cz)&n zBE!&SdI@(;h&gYFi)b~<5i%5&NHAe=^|$&$fd zEuu>$FrcQ8Qh0j>tF_Vjz)_MRA6`)rcaVbK+IvxBddM2!N*3cBejwSOPw13p5b6Y!f^Shg#_JjH)Ul zBOnu@3>Z@_7Kt5yLb?2a@`G>C-reFc@tzDC1PH_Ighh4-V#+JnuAaQXm-aVDjztNo z#GJX|AyOtS$AgC`I3B8)I+M;_YjZog?J-SNFC$ncl82uy~}c#zC5< zL01me*NU4?c|k|NOX}GCg3`3?1~jJ${W6_46KDW^2mse<*V9ksKY?IUktnshZpL#b zKmjV%XmtazetQtMEn*?&M;1U{=B+C>&;)z7!W@B!<;L(XGd($%qhC8rb(?vuoEZgl z+xp<>X|*fwd;N&ziFA`R=3uHLN?QkiFCauSU;EBDelEv@n2TPX-7KjG`Y)p(T0YyC zcV~_qeIYIX>S2XM1TMa`?z6uN2^MQ>sefYs;a9<5Tzx;ID~Nyu!Gs8KFN7%TIPCtS zbb&L?n3(!GtQ62XaKk|su0@NK7C@2@gt-6=f5Es5_ett;U9m@MO5m{Y%I8{%$V>T6 z!>_I-=M4w8`fqcBuO7p-{)zg1WWU!MJeQu67!5hriJL)UJRrUjcxM!7rC> zgX+^*r;Flke7P{tW6L;KS!7t>E8rimB&(Cj{kNsHOxV{-90S;0F>n6SP-1y9!z8UP z45TUCTKRi%xdG{LtLONGE@j{+}gKW5tIDX$Db#;gJxR($UcUNK>!AixI*lLP;~kLpAa=_VQACnfmrJrjgLh%v=~AAr{rC6{iL z>l`qC{?9ky1IX7j|Myxr850Hj5c~M#=ii@${i^i4+5f$sph1wN0UZI4Ez#eadBHIn zlcf16?A~MLZh4MoP-?42!@$R-`DQD98j09CCP~M(DVWFRvN?8lhVSS!+V7r<#N~&I zi``S!RVy7+-Gu0F580!An#-)#ubI#7El21)i!r|U>tsa+4|^KB?RSTAM}ALt)7@w+ z8QcpN`E^6I=>;I#6vNRJQuoyW=e?35sA;kuw@v+wIu-ZqoPnPJiSvXA_;iSFTu7=^ z&wcIlZkE>}c+WM2%-8*PSIIBUw)LbRTIq)Mf;P+j_j!e#4}${N%*S2-=Pxa;m#X|8 z_IGc#v&UDo?7I*{y!)}FUdQTtpY+u|T>dKZ*h($heXP6d?s$4Q+TF>Iw%ubZEB`91 z?Q=0RErubG(0-PAR3L$`$7xg3ho|7vfP>$5yH~brWpJnM`=bk)EQ2=P`l}-UxBYPf z7wRwGbQ$*DMgeWBfoM}^={DSdT-rRllH1PA_-;5?`Fh+$k*+#XFnP?B2S#TY2);N0zT)sBHW++giFm`_u0F9ejb6WL{z+vP1>Cxqi-_sWkzcMbrC6_r|3PUd?Os;Umk9md<){KO*#nqWz(S7fAP~e+DGaS$g1Qgk=0xl zbRO*hM5xgcYym=s`>Y$&sS?1PTyr#9uD2kmZxQjXSQ}c)9jxi zUmM*2#^+dD^m}@^nH$X={BBk}KX@I$`AnR$IXYoT zcG$z9*Z@|FbGvDlpaKtDFA26p^=->pgAnNM5oTMa09 zi`ao5FjLhtd7gZ)*FvTlYe%Q1GH|~n>pBiKi%2~#zj;>y7xJcp%u4Ag&E_-2YR=%M z9leY812+b9N|o&kMwCLgzZSPLerByXBYoD93vDCe~Nd~a2x z+-PTK9IJx=Wj-!Q6)sd-Ii0@3`aAEod>+P)9vFYWqCx*<_+%+oDK~F=rWK;hO{Kz0 zFxR9w4o$ogk)$RqahDdHw+^Qf@tdz-$)$CGwfXAntaX?BOPe6foVNSZk$EKzmetZM z-exRN3qIuqU*%*2u@>fQ=AeR-y=tIobXMPH8j}KO)=H83?{gAEr?pp1CQ)_8oXBrp zVShUY|0rxb?ncvMs85w)JBe$mdNObvqB%mLrdLfH8vX$YWZn(_3?V+mq~9D%r`?jk zjQlmM>waQ%fLM|i4|dUq+B7V2X9D{xk01so72-%e2)j0Ets#Sx`c~d0jo;ZA&p?VB z$Rcv;cWF8shdo0Hp_;<=5MB1`eZtY8t)G(gfeW|uz>?G7C{lW+GOI`NCzo?=VKq<3 zu8j*VSFKDnzsZ*SeH!719PPGQR1ik}*6>PyG95XN5D<^?tU!}GjbiPWZHrC$qO&Hpe7cPJTWagflOP_;a*oJThjbdF z2N9&mG?&9nQUh#Tq-alS-Pzzq^dqhMn#Pi6s{*S|Ha|+KM>ST8yFN`T@QnFY(yXa3 zJ2`+5Ovh5f8A|x^OSI(rZhrtv0}!s;T(wDhR%Bd&6%2@1R+oX8#s+Isi_?>hZJ;Nw=8AUr@#|)?LCv9G;*dJ|e})Q3aN*vkHm;NdG>f=Y^R;Yo*h!qg7h*3ZJQ-Ziy zLKI38n}lEMlP=h_sY^GClVeEXZ8n>2myaUa{HiS-8&Oau4u_NxdCvIh*)i5BnsIiS zZIxOVn|?1{p*OpI3;G2)Zy@SWeo*9~9<|fw!bRIjwQb(jrd*rEB+(n41SSEw?%AeD zUE{5CCiM>qkTqRGsx=(jO@Shr1&$D_S<)*th9k)`>cv0Wvl@5wBhS~O`Wbe@SG75H z=3eExG}d5kY1N~Gc!)9QcG{oIbxY`M_Hd;Z@c3d8b23${#N&ykGf~T1l}cvc>Q9=D z11t6G`BCbF_PPv8iKIJ@UG@X^=Mf*7$Ha9Q>s}GL%yXtnSYWQpbzkToYGX6gZd(d# z?izU9NCiSthhz;?{W!+IvE$QxP00~W324}{pWLhq6YYMqdkn`^;qF>!V%}PVHI9S> zeVuG~C0#LvpGqx4wq%8_Mmdt$CI}c)Y~w8rF5~Btzc%ng&_r?xu`4fhFy4cBf~1&0 z8ny5CK>D9KwI?CzG(p-5jfqzoI)y3VimTG0Z_Q?XMF4S#pk2~W8P~7$ zIkLiLJmyb(M$7bOm1|qwXniEY#j6dKND{{yCl$EZmA99v*Wp9I8ZA=vnQ4S0E9QBf zj?}r+B<);5;Z1Cnn%fFiA6?(Ksw_3*a?V^&$t}5(5CQOie)V+2=@}*OAiPQ2I|FOZRQ6Yr~G%A zg>rDrA2{9QRp9=#UAoOPENaj6iw-r@ze!?g+QYF`zXo%LJTC;Dk+J$Dp%03#J&7k;Ul?x@T((OE@nUW-6IbBknina3;f z0S$pL93n>^<-iplWh;qOd8-`3(kdNyzl(Qr9bGe`WAffsI2x3m;WFl zZR)sacP0H~v_#4YA4{xxEjzi5%Hr5}!q+dTfvJrO_+$q>1T{GtR-G7%d_eTiCZEo*ev4;UJqX4KM+GgqzG7h0)} z+r#?B9iuJft~BaUV1I*)ZEMPuOqe*w++N6ub?vJ`^xG77$`Y5Bjqj5n3JD~dd@a~< z?a8i~=I0=iRyYP+#m36b`)L|bHPIWjnZfHfdSY^gh*s27zvC;QZ#=@}-+XwB<9tw0 z^~cQ73d}1<^wDXF-iB_r#UlgoM`X3+bQzZ@cH++Q=UT1gXn~M!9HC zqqCD(es(i$od6TbZ1Tr3fmw6v9bfHQr!Erz@^fUuk%p~&UL>ERo5Gy?mOG^u=wbt}1-e@TU{i#2i{PaP+M;CilttRmORxLNXj!ieyKBI&rl<>v z8$x?Lq3LfADRYPu5xHn-jU*J#<4cMb(lR4Fe-4Y8x?*FYj+ELdC?mmF;tm^X3B;Dp z^D+=%Y~oa+FN5nKSe3~gufCM%n`cgFm(k0cid7`%>!`BIb`r?NC=?N~S-<>}?h@i( zO!4BKCfyAAH_3tz_mCdM)+V=_ofi^#n|6_`41tzZPfc}V>JH;PSLC4Z57SP12=5j(Wkm$6w&v@bP zj`6(J@EOSAvg0=%u;Y7EgV+=KIkEWT0dSnu$Ulx)nbS6XRy?*V@gpHwbpm?+Ie6Sg zd8<9mmtbpW&CL4sqy9^;RTg1&eQxM)ONIg&%1`Qv>c;Tk@kqrddxP|H)DNLycXL)KBdK6uD%+nRddkA5BeLQHnxs0E}R?6iI>Z#D9BDIQa8 z_Unylu81PlMY+Sly2S%&KwnxZlG}n%FUQ2!@()M1(j6@otMh-nDpw#V-EmiAzT~p) z@f9=mx|Cg;BOm;UxCnl(zhOdPJ#5Hj#9rsvQrW~|?xXETj#+EhDaZnr-0B4`k)Dep zJwF~rUrPjkcM!(Ry;_7ONC7wPrNH@w3eThK8qpOxf+r{dI1u?94YYlK2SSG^!dtL0 zM4xM>Y=nfDSMpqmbThSM1&Md((0f$MPoO4E5J@DQ`P5<`tI0|c?Dj4GuIt?d#7EYb zCjC95yzbo%@c$BT6<^RsJcfyji^LtOLv-ykvL**qT zkCaT&nFUZo_sCh(R?aN7G#%jgSU5}jXCwRAN;%gQ;Ro?W!%ZqlAhZusz195sk63~~ zCVY{Nwv4|7K{_qG$8T2q{-8MGr2LY#xl|nWiLs|sjxztBgz5rlq*10={|T(lAV5N8 zenu9J{@*76!S#Qy|6dEPfshsiZ+`CoX}s7`T>pFh|3CU45&Qo;4gQ37Z|8fKeh%o% zP(b>neK@f5ldEbymA$>{c*>+rv&cJ#iRTI&W1L{%fTZa3o!2}K&@-oBeUP6lq>mUt z`o{_Qf`@>V1UUkfK@jU!JC+1Zw{4bhMY*nMSRRJl z0}l`oxcgJPi{W=IcDr=sn_Q&>$ivg8BP`kK`W~BrUXK=;#D%r~Z{Y7>!atYjhMkqC zN{X`5{>tAxE8ZLxEr-qEL^X98vYSCE_T6t&q~6C}kU_hq&7^Zca^-|6Vv5=K8+6mb z#I`AdfDYNTz7K)MD4dc4)$`Q(>z-t7!$ zKo*DUxz5uZG;L>r7r;d}cTVfi{`Ep0K6e(=u2Dtvvy=GUpX?UIE6M_zz0835R;(1M z44~MH-U3o@CL-V$yvtel2}S<5wa=O1^OGQMzz(@r+#8VT3+K(V+sZhOC&Vxc0c(JB z3HVc(VKt!6b1h{9HDQJ+0lOD-21+>ctRiXFUxyqEzA4rH>$5yc8h(sB25OfKx-KoN z9DbbF2YdJ59k$rLM9R;MXlF(rT6UgR*uDH^r*yUKWruxDgPl(31=t~q@rv)ko_7Zg z(=eU*L$NMPUV3U~m|nppAm~pfJs%SWV-UI&*qpRdY0)L1W zxYW!uovx0(8V649b$~UnReYqtv&5+&^l&b~^SGn@_jv)GPnZO1)c1gMvEi-P)G@-` zVy!gJVPphIlnQ`uskLAjg#Oo5Sk^9o#c1LS=*@*_%#GwW?KfLsKp5HcVD$9N%X9kM zRdrYaDiYnWsGjCO8;yVYekX@pbe62acegNkD%CtIRgwRsx2_wNq2M_NKPyvpC;Y?Y z&5r5ck~|OWET%Bp(!`oj61e!`FRypj^XkRrOqDMeiR(|JunvChe+n#YN6u;~t?BSZ z0#A$jpzUh8ExvUQ`+v{#`XD^bkCgAW!E-LWL2` z&2Nebm)zGQn@DSmje04#%xAUC$0j={a|(~dtw;lakmn_FTXfjH-LD$Q`Z@Wp_tzXG zJRW-t6Et7TJFk7lhmL!1aeyB#=9H|;Yb0SBV{_2N8=pO%_LIoh5=?4u|Es4P<_;k? z^aeIecY(n^?z_a|y@uvsW|uzKJF8=t$zV665ry~9sGsma@C<~IFg4EUdu>if7U1^{ ziDhb`c<-n-+cvHR*Y#q{IdA2jB>Wr7Y$(o|5Q#shH(9O=;3n;lb>AuN&nKm}4S7Q3 z#nJv*FLxN>^=ORxxby)dO?Rmz*^=MQ6}9=U4rYb$b{_QM8@xF4b1S0EA_a=@JXCm2 zT9a1-84IN|d{z$uXqn7jq1H)BVwVQ0lk>liMS2lX8B_fUt0>#o6Y$MikX{@vzdnSS zd0a-&U5kImdZt*;I(2z6Y{wv>WcoI4z3CfI% zyS5{rDyRG}bm(FJRG1QleB!Tdw8B}@s7cb#qlZs>KbISiUFfYP;+3u?qKfk|r)BTrOK9tb# zW!T`r)3Ki9%M8!@+ia|GD9#Cxna}D`U-9$vvVCuNy<1muW{TChtbj>vZ1)pj@7*C8 z4h>-bHFtMNU_T3s!09PDmdqbvhl#Gk^hE_9lmxg0u2+Mai@&-Ul&Px2K1zaVdIIr%|>x_HyW*!yrWnHT+;h`$Yw`0|)=VHRlC935}7S zdYPu@6ySMrvr`d7w=6o2Fzx1(Jy`G3eHYZA7V1L4**J?$-NI_PU-a0{Y*=@<2CN7$ zFb~Pqt^F^2q=4`NEW;;WtDd?EAV^!!s4DqY#96UV9bDOL2zXD?B3ALZgQeHANZ07`OcNcvbXwYHIoO6=pw6qp`Hw)BY6g{$lzyQSx3Tl)MpG{bSY@=I3Owce4Z2Fz1FJBy`qlo*70%Iqb0+0~BeKsRX4 zMm+)k0d(Fhohf;Rky>|;8Rn$PYv_BJwy)fujc5Bl-K|7(aZ^W6#IpWAL;|sg@YV0Z zEJUb7#qD$l%uc^=IkkJLdce%N|2}>iV1BXkXdu}CXT^8c_k7^!o{^mJK!Y5aZ9 z2WG{8d~h~3>J$4rJS?ySDr2i3C&>}PBwl}NKprm5CwB`QByUs}aFqCC1&;$TsCPfY zC!>OEmK_6V0_!XoR|FZWr%Nz7H z{__bjUeuOp1!t*Z#GgB9vHK)TDJvmR(zAjfem2n z(?Jo2QORw5&W@Yl5;hTEo8oT|V7i;|MQE1o4h~toR@w%7zwYciUs3(6cG*Mz;}K5G zk?Sv;(jVJ6`)8URD1=e$)F_et{S5|3RPQE23~~RVRBS0G zT(Fs+Cl?Ky55Hj4&@ibvr&y3~AwrMR(#^65%P}{ZL|IG9bFR@OX;LZx>+`O;(4E#H zhF`U$Ats3e6`qI!Ljs-rFH@*wKT1^64QxZ{CpD4uW?#!Jl_s9`Aa$rYJ#w}YC@B2dilqs1MKg;9cbl0vEOdE!L+m5Ngsz$Rvu4u7&?Rom z_WYd?1^rj9CvD%nZ9GXC1-G}il^Ub zsHvlwSsJO#;6CX!RU9^R?3>gC-n<#pl_SsxP#DL_w1wHdd(N}gMq12b$_XcG#;PQY z8G1SWRa*pR^gZmGVU6}U+qR2YwzRvP)lQy{lYZhNK=$X+l70^y7#ug=qe)UAAA*_| zD^r1GB|Xp#i1pC|s z!ZhbgyD|5$67Q}URpPtFzk0oda{dAoe|#g4+Y-|=d`?_(hB9ajJz=ZGkc}@B0AQ5O z44Z-$U`Juv5Zc*N8VqejrGy5k|H_XROuGd3&ga04&u#;pA9#<5WgL}8f$b;nu)cTK z957>9FHsoE>foTLOQ)cTk>0S6Fve#qp{yPr>xarI6V0?vycq{}h#6&35G~Du;TrvG zQg*Br;SX6pm-9{wBv(rj4O0pBLiReDqu>Dfo z_hz$}3l-`1qnCn>mR6tLmlcAKT^wZXJ-;O^R45eJec9X)Sly@Uv}g*@_Zmd`D@LP# z^K2n3FTf5yujsVZlXW+eV7`^2oGZVyyX% zSb8{OaCe-HZ!8dAEPR>vgUi50zjP z-Hk4O$aGzx&yU!Nd4GkWF#?=Jk_Q@rli_BLgirbJZas)eOoe&H*WtJGOP?ypZz=uX z74-S+#j>`>GUV!D7CiP4I>4Z{rYPRi1oJ8g`#OUUb;^BQhsa!!^iZr}hXmWo_y^8sOLffqRxQn9RzP&{8TU$4@%lgK~}l z;**SqC^kpU`XB&6RC8-U#4+i?Sn#O1j7~)wWIvWw7olb*jVV>j=4Yrv$ut0tFmKCh zjCHgJy|U<*7G)zKDpJV8l$~ZUah#H&+jJ}n7002XNWsu5ukJ?Wbu(CR_Gb z)?iAb$y3$2Mw3@dY~~fC7z&w`6oau`7*RncDntif5-t66F4*6+VqV+WPkJIhOH1Hn z?2^fEVjG!KwW68Q)PTw{Jc!bcG+SWb%@+ZJh(vC50fSGDwHaUfPpBB z7Z)#Z@;sKjlT%lL*rZfql+!J8mN}&+#V|Fv@R*{@llqU(m5(@cG1eM3b$DvJ%U)5DxsF-Uqqv@|S%fqv*oqYm~)ttV|hDg+`-pmPTwi!!CAzNO~sOmbp8QMM~}( zK6GcY)$7aX&t}E$I*hGq&2lP^Tq+m*0^t^7$ifu2nQhG4=;VDJw;Q#x4Y$F<8z;t7 z5!?GH>1ZVLd~-@X1*P@+wTOPesdEyC8?7rHoWuq%h6bhLo=jK9mJi;S@-7I((lV)g zE|EPRhm;#pdOJz+G51->`so&pqhxMDz6gPY2NiDCL8z%Ss+`C}-M-(J=uaElLJ?gw&v>U-CTXOD49IG2#7piYH zw~#$Pb-!PvZsg2EIInhg(@PYQuVg6$5lW4zH%1Pt`#ju{srnA2u}k+Gz}e0d#W@io z(^Vi(tW>uw*4b}HMR-6jSLf5KjNVvU1e$(?rkbU-%4iTf(c2^_HKb79aA4)aQEY5H zJxZRLZEYgsDu1Sy3&$3HRo+|P0>Cr{WcRDcsdb3&D4f8K2*JP2UH!zVu2CmBLa^cL z9Nke4GVPT)%^z~tJhoG^M%-?6B7|PukXu3xL=kbUz^K`n>L`TXne2oy(O!h{Ts_n* zJ7KhgqXy}D;$nqhSp{rf{k#bfPx-Tc3&9vZA)aReF}A*jx<_eyY zU@ei_eBEJ9FzJc$49b=6Ip6D56+$&lB`)%-^{D-hXv=|$TAQrfP`}dVz78d_WX7y& z@(|N*NIwGRKk1!XnmU4eBAj=)>y~!M z)eK!k21VSO83m!AdDWk^wV2xkU?RGW=HA$B8K!!k<=eF@btxN=(kEM7#cEYJBu@ql zYsjP^iM+)t$Evu(T#cuC!1psay0G8y6c_ugRMS|;55R#Ar1zXmg zdMc2|8M2wF7!%d0OaGLy$+XtR<+PXZ7#;#6@RwMKZHBvjjXo(~7RxE49{tmQWN{+7 zFMyDukP7$k`XEw$tEWM$YLWn4Q`c(Cvyc|q_N`fG7eAYM+ND7*&lQcXei_`ENh?@M zJe~wUTb6jz%td#y*bi%ZCe1`=S%IyT;$=~P-Z=k{7obaZjC`KI=jn4E*dcym2+O3K z5W%J_I|-E|O?Ogc5SO&XgAhFgPP*Z(xped^W`}Ixh`ytupxHoOD>sQ*PgvoGiAi5p zs$xTJe{^2m;K}}j0`9_d;ZO{;ClDW&M3!1jPNZ2P+vPUX|3EIKQE8RWjg2fKErR_{ z4b}2XueIy*>DV2&MdNC$oo3n>zEbxx4mlnY`-1TBItfZ2^H{Z=P+qv82)FUo-6;p= zN^AaLLrc(}s=v7zi#e8ljUYlEX!my#_oDVN){2SuJD--$lS16|oH;Z#5 ztj>K0Nh*DW3cBC?5kdRtFE&gTcg|lV0(Nwiki}PMly zmWC+WlW;k)O5oOehKLqFF|KIgGW?{!q34nX=@`e&wE$;RBs8|N4-2G)=3LN)7-$S%G% zt*9@ggTiL{;X@0SDd55t-U$oamO^8mt^%UEz z67tHq3rs3E5YmNugT5q2x9&pI9XT7`fCHK1Ort8}suwk9T3;;)%io3%;ER7Qaherq~x{MIBd@71Y>eecnR-hRU;!YLmVro%Nuh}lcenDqUY zms^7i{lNKK^i6nmF@LZ(h{e7nL?GU~PB;e#wu>Y#PaZ2_mhOzeuHZl^{wVI0H&nv^ zMv=83rdyf%ZexEXR?y)EEO#Z-&&R6 z=qbdi5{OQMAT%^XN{O|Yp;KQ1_xaJl^c+J6z~WTuLNToBFzgl5D^NR`ivz1iCf8ND zz$^G%N~3!CS41U*k&GYo`pnKll9*3J-Saz z8nAeUL%OU!kmttzi2&K1cP&3)u^F(BvuO?c6|zkP=0y_2OE*qZzzyRi^*pmEEo}6o zFp{GE`ba)Bb#0mY2|QY7SWp-q?>SnC`{`{6#e|8PgD5L%dCG??Wx>f3!3*h>;1X;C zCT*OU0r3iIvwShSG~SfFaLTR%pw*%7)aAvYf_T{9m{X(BKn#r{m`2!Ar9fGgX^a{N z%K$Rfyws=y{qsX(1>{mlc%ctQZQx(7s7R~h3xPaJ)JbwI)-sn zKE-5lOy%=2D=HHmFI8RifIQF~AA;~korQ@4SU#7 zA7iYBugV}0czn+z_J#IcSKi_z`GzLCl+hZfh>UO9K(!;kdeB*A8Swb$A|=(rMG1X zgy0zm8R@inF>1n1{tS=%bMD^!EI>-!q}?=L`(!MzrxE+*q00(<;&PQ!qv;Y1|NTqz zhDqo=7h`jbdts15IrJMaB(gr~kA^tLYxACyIIydr$&0Rz4h7a&RB~!R(?X!7HAW_! zC@n+pLNQ|>7+jj~3B`>q>lp2o%a<7T?yaYnotoem%X!6KfXmTm+py$1ucUJ{0jeSH zA(0ocVv0=C^Lm3|R9*0<#*PzX9NAPTUTq0XbtnvPts~O9aPaVo z^!NAukm~+6`9=M-2Fw-`p5v0IRA24Oc=MfNVh0m$;MKw(ut}jB2F)=a#BdqY5( zD{IVJ5B^(lT0Jm)4Sz#bc$`o*nJy3Bxp(=R`qDoieZ;z-X}bEFoc#lzS{D(MA_BAU zVm_mlf3p{lg&36K936uIVciCEq7BrCUA{tLPfL4605$F6Q#H&3w9!5OX=^ed)8jRx znwO)}(RrPhz*>hXl+Gel1+%=bb$M*IG6?^Vo@(VEiM)lTh3=)-phvlgyl*ghf5GMA|QoB6e@&SfK~b_5RLigTqs;{*aiOa`XZ^VXPv|l%b8&Vg$JS%)c;FMk+ z9TrX(!5v8{sc)_gxm8e-vN0waxin}_o0<0l)qF^!hB+32G&T|&lWLn~Y_cjpLgBd> z&YG-$HN~-$M!xc0?o)nY^r=-J4Q5~(xKwxypoe*H8)l&Xh+Qh=_$z*(R-9M`0v!A< z8VWDNVt3?#h`@FPvHBJ^dN~a2FEE3^%qsFxy+SFkM(q{Hx7<)kOwFbNTq2rFerLM!e0EP zv=%C6z!VYq$9tJ>_(>CXX_kaca@nSs>Oo^XgxI;MWO0WxP(*X(T#D6*KrofjQH``! zU@+&K&r%l2>z|lP)sc){R1FKJ5g~?DcDD&16o=qbZjuSHZO+MAkEyNSN@y`?+5@)G zmckTtmZ6K{mU?a;3bpVl`ON2;Wat-#0Adg*VGTyHFeP;ZyeQo(t-3OPH3g9L&9~Df z@JH1Hi;ykVrB4Cx9Djm&2PKVOrm>)Ze?VBCbVbCmgs_xI`!0Nu=%-@Y^~(DqXIdHf zcFZ0S&c8$GJhRY{L?*NLF9Q6xvkE2a^YCA)9`hmOkcGEkqApfVQs7M4duz0_J;NsL zH_EUBGLs168+9${=)1ao_DT3f8sA(U-+RsxuqbE_DS1p6b|q`g-M?c`%u%S$O_kd= zRw=#m@~I&GNP#}uie=J_Wr)mi@lq50l~91+0Z8-VhE}2~2*O|`991)>R-Xqmu{7c- z)i|hJztS@r);3-LjyQ|3Gj5=l+9yFM$9a5@Xj+buhR5^~>t!L$m;wD@fV5tOJZ5$@ zRPntN_a}Av9sHXu;bZ@7@B{=wY@}5}Tl9K!L6`v(B&NR+*=a zTGF{q3nGeP?XH|d_P8i#nk8p?F}bHxvMPZll>*cGqs(ZjXZcL>Qu66Cou@LGrIkhQ z>#55zI2G5$fw7-OzLVgE`F2k)$lAvbmVz<+Y(->o3*`E;%J5V@f+!5j{>SfNm$nrg z-C+^j!p>mIcM_UATe6(UvuPeQ2~y8uY`^zk3-L)eJ`3hVBmVOH8IUvN?rWr>>(FPd z`WhTxf3HHfb$s<+OA5Oq-W26oTV8DRlPa;ETXoaO6(d(@EHn_GQ|qR(j!Do<+!dC6 z5pFjd)x5*)llV0TnnR|YCj7d-HJ0%y`>lGV28*`X4yPUDprvq@qhkIdbabVx27RjF@&x3eM77dWPDe;~U+Zz@I}z+KYOygybfE{Pl^H)_AXw^|aTMFpLS%%$a*rB!=T zV3~*pRk$5Pu5uT}SasX1&XGYlp}jKXMoj}-BB+@6jajk>Hb=zhsb*S7SC*P{S?T53 zgH0MQ-6q@?-it&io7_*{VgN`A?UuZ9q%bq>dlt?!LWOxr;~?ew5wtSO*iQ7Rj3MP!E&Y2`BaeONh5GAWv-MuedT+3tyi;A2w1|ZR zw&$uNwRI1Ul3|vbd4A+|*y~J0*^r&%Q)g^8ptWM>T6cvyu_(u78v@DQ3xX1AMWKh3Q%Qd_i(wNFg_89-X!JHYf8{ zQOQ2T8OxggP0KO`4n)?>GOd~l1$+;AWu+gJ#7TdIZlfKObUTR!rB;yz+G}Kn_`&`7siP+OJ&fE!jkBH!IdOJPwV6+hw{xQVx3Fd8hZY5Lq2qbGZ z3T@GQ&KskUYj=5%jv=t%j$qJprw+9b=Oy+a ze?e5;$y^Y6E&e#W)tJojxlH+lYWizz?$PN5rO}2#6-MB&_**YuiaSc{gtMr!4m;;T z@kz*yK`dTm!c&W^;jQ>FW?g@S!doRgo z0t^IA0SgLgXx%5ILN-UW1j!!fpVB91;la?)KsrpFIPsfgWPr{W(Oe{&5hF@F;1<2G z#!FdH|ApM!LlZd2-(krvB|O@HtNZX^A0mIezUSwX5qZ13vl_N1pv{|+cgc%@QYfy4 zReC*pCty@q5IQtRbNwO_e)f;I^Y8cF_#^Oga35S!iunR=8wIF*I=Mj$jR1sC02dQNo(%eHguf5= z?-beeP-DfZH&9)CKO5jap^1V38VLOBDbmh7s+!$24;-IRZ^wD;9AZ; zO0f^KrS|*y_Y0HnqlIJax7niU{@T0~z_BZomP?_K+nhyepAlZ9JF|~3>mNE`oMN@y zq)O&(t1>>nPE4db-}#fV=3j}RF5Evz@*~J8PeW*{sp0*yexsmtBfc5M?LU@f zG&%Wa84p#LT9QhviZ-B_4frdKUVl*xpAdgBu^+hjjky2!AHw{NX-TZtG{-Cs#DL)U z`PrZOkKJvB@a^ZP2u=Xux!g3Oet`FmvF{lDc+T7t95k#5B3lAW zpN!toh{djO%&|r45Wzoej*a9hj17Vb;DQnEfKy|2HjT7?DbgLpHqJKu_Ysl^0Sr~G z>@X~4cP)fW5eLXr4PA7KvBRe3AFL%a#(+TrhOaSy0_NWI7mn{KQSW|-I$XPY7ls49 zSswEDN8kgJFx@Zb&8L9`-b^65H>(cFM*eob)aY&vOB$E>htEK%`vS*w4S1LGK!x>3 zRw7yMVatmq`roP`z%x-D!;DN=qT=q?5oWm&##;H2m1vfGAs{$vu>Yk~`auE4(E{8+ zVt0q^HUP!E^ATzXM!40#tc~GoEO#Is3Gjl(5_|z?7>WpFlD$4+|7n1x;9k8gBnb=k zfKGRc>Ziv$Iuk~>ciQ`~7>UyIrux_N?mz*|NUEmFbC|W?Y4RGNG)a*selz@A%qKBJ zfLoIPWnHVVU=ptYpM(c=yDe6ABmY0&H?&6h4paf)&*z{p1SbcK1=JGnS;WY{+4237 zt9E{OIkOWvk&WjEMo2_dWV-!F! zUn@GO{Zq_NR+M+)z{ufhu5!uN$@H#%IwjDqMkUuI=0$-+9 zcF_9w%M&QNKvw)Nke4qHBw5M`|37>kNIXlr1j1^=ylxBV2-}xMjc@;LX95HOpsJ|@ zMj)L~K351(F{gKZYX4TOhx{1EA&&7KwaO5V{NKeECP8Sw8MA{{d2cf87UxIF@*OrB z0}MpT)P7Y*7A#r24ltJrf#hmNpd0lA^q#}w7+i-K0HpRC+(?{@&RS8M`t5)Ibi~qr z{fU`9hXoioMvv!CPMx;^nYK7X(RwkfBf!?6hiD{B`Unth911|Poku%ew)d$xu`hsL zB# zkqzE!89Og3A+EQdgxwCn*vbe@Y)z6!0QvB4wxKX&l(px@E-;zc0tJH69YBWppwo2J zCBUB*&8X`z2>=OqM~yyZXVX!SeF9RX0S{LzLRAAmdYkd+7%b0s+f7zs*CG;#o~RkN z-zYF#0lXf`qu2p7bR4=z?q@t%7<#A;pfos+g6m&6rUrx_PyX;Zjscl`D<8>VHvq`L zk6`>d7(?wnqoz@ah_72+;zc=ichn&S16ET1b&5aIX*Z&Plz2B2z$bn9Waik9-`(2d zD}iM44B4qDvq!{jPRcd)ts;_#2(Ku9_&TE_HZ)Cexg4Z>A~2+%PuhKBZoPBG;i&CO z5ujf`oSx~d+^RPNqG-SMHIUe@Bk1(%#%B%9U{G9MyYd@w=KyE?x4>iI4hqv#66zAn zPF<(5L?8t_${Cnvwgcf{7a7o=!{+I>ZGj^hPNwvG7z*|cfHdny*+)$Lel&DE9Q>)x zyRoeu;||+U#3@qA0xp4&X%e8e#%Tg5nc8m$UV|n8i1a<}^iS=0*5mbn5EKX>mWsyT z;k(!C(PYzPL~zg6VR`HAbbbUPaPuTUhBDyY-hR0Kjo*>tV>Z*=%sDIel9&3VtPQ~3 z##45A)*wP-@4$Qgk6jqPtTR+=$YkEE2LQ*r3qZER53ug6rL{KxQ3ONF2%`ZTn~tfb z7aM%DnLG{^CD{3Jz?FUbqo_YE8knQ_qgM!ES7q>%wV%PR-#}x60afjffRG`*6$OVh z{t0m&xZ%OEBa`RX@I8!j@=#o@r~tZT7Y13~?nnu}KR(iAfmfah7DKc34Gx5)54^3k z#tw+~`D2_aZ{2<0joNaC`>@I4Hw1Bnk$sVAGPgj4dxglj0G%=d*$~I;<%JPdozbuh zD|SPK?v1o9OA5bY;5Sie5pzxRP<|bPL6WJRnD+qZnFMp@>i|5~T$GU-AQF*_6u9T9 z72fX_q{>6HJomh_|6UFP%LLY5gxz;=4m)D)r*x%$zesJ;VGEqf2KeP37%@7$L;k)1 zc6otN5m=sQ$=TxzU`iE6t8p9y_d>+WAkBLwacBYKdgvVJlJ_`1Si%|d>wug}usnDH zusPlUR2t;?1kgt9uqzhGA^gBq5=*elE=-^8{57pJf$ttQ24htHwXGjv`Oha3ty`v( z68K|hALUp6ajvfb3V3XN!hD6}2ypm$8v*(Thr+)e{zhBO;hk_i%cl^QGRvM^L>>&^ z82dBLzC;CbL$R&ef(pF&>Xl5d!zK?WNpWuD^m~A)O8${n!KHJ`)Pz)10o=mTgm)m0 zqmWR#Ww0WG%4tO1H7CDbH#A)b_WUfb2sBwQLWFc3a5n+v7{Em|2{Dvciwa&y05YkOLCf0KLVH}i`4)^=%*-K=P`gwVl(@; z<^@PFP#E=nWHz@y=v<_#H~sAC6?M__;4pLqGLS8q<)-wPPy9 z5{qL@FTXy5k%?9lYBULzt|kTHy!0lE<#V<^;<|7DbfcSq` zax|2mDOk+4W$4S2(ZZNgE4o@2%ge+QN5lnziU|VbRi!prmw{G}5ssDG6ziZV;4` z?v@fz>5`BRX;2VE8l>eN%f0vcp6hzAbN+(!<90LWnsbaXM?BAce;z84jnb!#Ux6^* zgVUqYk3r3-N~#{g1~KfBy-@9MwAwPMJ{|D9iW_&9g4{La-a7rZCnid7A>?o`pyc0t z-QOEGT?1A-F1^@?Mx%0Ej*Y(7yj%P=6-1JMQw8ByEZdEgLLk+Q}F4Y|=ab0e4t31cpk&6*; zJdx5HzM0-D)0b7wFQB@iVjl8$9n;B@htI>%J>&a z<(aM7j!4mMc1p}{9rAOj*DwpMRg^F0JvXM#{s;Sp#xPl_98tjz|Er#+ziIKYk%aAJ z_h>J={XoXcbJ%*atiZl5!erGnE{q0OyeV&N@r~EJ0K z@yTQ=!@FLE)nDf;GhLcA{M%ILRNG$8BbN9oWbe$2i(qkMEQ9v}_2Agma=a+H1zZ1Z zMWcZ@hG>D^_~HHZURs*RNv`_Fa61mf8v;tm`oOxLzk_#X+ah?Jdw7$P!``SO`x5Grk)l`#mI{; zn%VXiQ#?+V?vW?((W=vn8;n7TXsa&wD<|*}`RtJY^4ag$bsd!E$X>xC!W1@O5R{Om zMO%$T2V1`9s8hCAGx3ffA`o)59b}tyxSjj0{T@A0jW;CN-w@gCSYAjsGu>bA@U;w- zAot${c7>eMu$FY}?0pC0{W?pc85UA`3w)zI6dGky2Bk5uEk8Lf{@;?=BE2U2PEchX zrk5-xSRPOC-xAy|j&zaCNX$MWc^nVF{8C}irT$r?T#MSNPFnpS`JXJdm}&A(qqn_b zam=hMrg*18Oj4P*T3zaoXx9gNmtQ6e*R=7k+n+|=?fHOX`7#%H>C0g`d72 zZ0p8CPOXxWWwj3okos6iMw7BC*uHn7Rcb1TrXsEL;#Lk8TNkvA#yl#s-t_)c<6rbo z?wZL)NxkmjXcQ(T2i*&RNZ5ow)0#ZCP3H6f(uU3ciml>t49iJ<*_z9kRI+Jf$=rV!Qdh)uS?*4TqLrzY zP+>>UWy3PlRl{sC(?(!ZE)t%X)M6+6@OeSTOSX#2A#w23Qe}z;O?+}H5R4eV`)|t; z$?8&N(W?oOC&LcE^DuRrsFHbyWyW-& zXSY|hX98O<$HDA?oW2QKFNVbg^ndbHL9$RWpM6DW)KET}pl-WzQLmHQiHw9|rjkLm z12cV^+3C4MF(->LrZn&7d8o5ByazkQqaq^pM#g?Y7m~wiHU}T3G4i_quD?AOB$aO znWMT{hJa1@rA={(T)en4%BTtjwp;mtWJoSQg$WHD_Ba z#<~hVMC;@W7xtqvw4afI-h63EVtLGkdpTKeUvkrbwtzTy;|sx%o^%Z0@5(ZaN~6R( zsO<`*6yDCf-mLQ84ij}aGmnvvd<@eKQ^5Z1WV=gLCp3K{>@ki?{2<mhxxB-ObT?zT^%AS#I%K-s4U1*GEGAR0ulwQWH8 z@6P7;ytv~7{E&wXcDhNH3kWwDLUO-!W{Pclyk5Cq%3{EFGg&=K;UOwrH*q;yz3gmV z^Ln*f*{G0=NsM1);Ay`+qC@p$3rD{pbm&5X=pxHNxG$PkoHfc))>|Z)Wt*uT2Tsyc zB4@^=Y(lT)bT~L#M}-%ykKd31OryePnS<8cv9E5f!*mgM^vC_M+9Wgmgc|J}urasb zep%iD+<9y1`%2N;vs3dCG3I2^PxtvqW+yAB-*S)M0xQ(8iAN@B@r<5&EKyobFk~*= z&+9`MQFCQ=vr!;xDp$3$boX*j@xtx+XrS#sR&EX`XX!17<_*(kG=U5k<4d2=@)XndY(9 zJBZpnTREO-+Y+sEOSwnSv66aFQ`MdaBjFN$RqQCZoLpPdxV2rVDWJ(jC2{HuWdE@p z#*$tx!aP%&I>4zCZi_e%+I8y$8R2n<7KqR7qE2=Ay$%*iE6uk3?u~|Y>x#jb-+4>* z_OuZwuC|V|V*=|aI(tOoPCx{R!iq>gsn;!{&UMwdRFaT;NL;LAMW|neSkK$|C}nbO z*vT;v;)>@5n;&O+tK8RXa&UfSB+jLrl=s3)Z9DwFccjxV0Q0;Y$E{9!M^rp(-0@KX zwXQh6f*u2!Sg}(jnI8C6EU8Xee@L8PV5$+G&u&qE5XY&k%PITQ$U5}GzY!6C$Z8;L zh|#OjGC}R4M>ZJm6cj4@Cp+wvpzrb(;};TUQ8U<+*^SO`nK)|~7TvbIr*SN0rnd-t zT8m%dUY=9jO@d1bvcqhJN+3H7ky4%jM>(VOqEgEQ1U}G1%{dfnqn6nsAkU48m8jbL zidedI>7}OD0hRUcHNxCD3kkq<%VM1ul?HT}5P~5%ktK}-aj#wQ5& zovODJXuBXmC`Odd92AM!OK5K&8$_qh;2LabqQ~Dlq*wZ{cG)% znm5GN^v^RNbpKvs`8!I>+ zGyK6C>sd8TF#T$F#0cHfgLAx;vdlsi$>bBo+&b%Jkrizvo!iNCMDl;`hy@~YikiTl zL)fNl!{-(0s4jCrkjqxL z*GOH(ok1IPT1kn(Xf2hj+^gR~Mch#;YzpnBy2_z*NOEvKvM~W&UX@w}L6I42Z)K zsoxSIA|eRupfWSJ)p#I4g4wNy3l*#!>?YUoFsnIJ*V&#*b?+zT zq31T{@tJhH2}SYQu%952NWb_)M0oi}-TuNW)p~PUBSoGEOsWD;<}xz0>nMn;a|hp% z*qRTWc}pyTxm7Gn+WwV)Nua`s1&VyqAbQtARK^QJp`dr8Gwaw5Bm63}ni(v~8^A!7 zQP^j{LiNkxHci+u;OHYFe)q#vKu7o|>V|>=9$e~FkUvZOuIzeh`Yi48jce!4(}N<` zg=&Z?RklYkBI~;amo^$H`I~nyLAMv}4Uy71IAvur*{4S;Ul9TkD3&PVc3|Q5noY5P z8%PAJ;_KG_wA%ANn@kRS?q*f&3FF5BoA`Pk0y20L%Grn-$LK>wpLf2UFN5_LL&J=v z1#6tiK-$4J`RBJ?ReooeBDFw9TxfwO8q7l=ez;sNDz>~XJ;eEYlu_kXlKn?P^+4?~ zUoids@bI^{RwP&_@en?iqTnT*4<{ka9W+}l7v2$o)GS;i+kYJ#_rCN^<~^>R!<4pR zNE7c!3Lq4|uxa{vK>hagiJ-+F{USNW&AS?+bO}N+v}$^$1v}8M7hc2S22?+v_AIFm zdsh{1Z%@LjU0>$ragt$+OtiZI=djbh^QoUfx{l~iw0IDa@*Qa%_|}#KpWIp-WK5)~ z%&lHY8oiGvdIlm7F5seL+gOaE$yAUvI7}i*w3#Cf>q8<0a9W&6Hy~4l`J0N66x`0 ztykCU>b@HTGj~5lsLz%^{e1i9$tQ(E$IPymNc67Jr1>!}Ky{+097EB-*JW2mQn#Kn zrVNN!cP&*R>+J$HLHI<^Xj=ohK2F_06!wR}?y9HW?jV)*vV&#kXL6wU;(BJnL``}C z`po$2YXG&fWl#Kl2Z06HOU{{isObza%=X03gdY3`%C$X6)msLOBm7WQM`{7dx$tSW zXHgscl;vHq1hwK`Iv+#LKjgDV&-ew3KGeyii^ZYO9RImmOo{y<7)kCO+RFvRy0xWN zPo54fIXG$1hI7y`garOSE;_BB= z*t=Y-jBhqnKd25_!qP8`yI!oKuepVfR}m&2cagIXe7*;f=T3&4Ni-M?sSBy+U&1XC;PvGZ@$Ze=%9Fd`r7((F-jjnT(jdJTfgz{KhWNcMhIWWRyseaM=BU8D4>UB3da zf78g)pc1-ZP^Iv>W(-NW^4TjL^{6@JW%qrCUOCt}X1rbv025CtQiL!lr|o}#6)Vrf z6z2oQbG5~IgP|ajm%(TeKpIsBiKPkrHtlkN8XL8ya$bUKOs!lnltCVD7W1=Z<@`)% zQ*eyE^{y%$jVLrWNdG0yV(S;*n6O=RjMT1I^NPHtoeM_ojK~D`v9h|(SXaiu)ygtt zp5+!|L;=*Re$&rrne=R~FQ!wa;%2iTI11hVUZ0qLd1A?BzRh;Ya$+@RRcc8VZA*`X zPO=Y81SeP8j!8=mmXpwyZ^)q9WLD$;;^$5qPmjD+>w2Xvg~9j6>fxrTfWRC0?|L(p zjs^vWEA8iUG1;k~*r5UsPLOxsi+LI~{vjjU`oSt2RdMcZh#DSNdEI`^|7L0=qi?fY z3x&xR{c7%-4w4Ee`A09c7$n%jffjN4jRUmug74u1#6mq zWb5Q_CQsN>RLy{_^fdWKV~F!lh;8n~E|U{Yk@jRAxk6VgyqYnODy^HKkvI#N_+Gqp z7v|lMtor2f1vpcY+aHdZ4}!B03BfGWPpBkR_uv**1yDwdO^VB_rI)iCt25avvkEiU zt5PI_+3Fvj_{N7_@~vy$R57#CLa{BMKTfYOqjDxhCN^KQdusIF2ml8Ix@Tt0C1q!G z3hB8do(9?o_1NdTR||!sQ$;Kg?{s77U=BI}rWK z6kg`&j100-^1TnLTcLyLP4QVxgYDeBL{LV9cYHCu@D)Z|m(WOWVZ{sagU?yI$-Nb^ zoxN^LSq52&K>`B?1~r(?YU7p-6v0jmN-C}0_B z!4Tr@7bEn-mOFxEj@7V<>b>fTtuF6^Hlo#}?HzbE{aScQ{8yZeFBeJa-$x{g(}nte z*;XI&m3Q}M%QM!|+CLIj>0&*@)2uVyy$A0y(^s627%XDVlSRf8N+9jdgU0o5-4@+? z_h5}H5j8(^sPrP-hZ^wwJokB?sCGJmZ=+T5n%@XE^w|W9k zZQEvpr^a_SDV0NF{xiJ!*o?R6iG*VImAXWxj@3>5@NL!Im5j&Tzg<{tuo98j{un*J zZv)v8X0Uj%5eD@$*rCg9IuEvW=_u*itt=2+F|>sr6!KSw``8cUJgu0+{m7!KT~Weq za5FesqBla+2)S!6yI@iD$I>={u;|Ftsyt5XmUW**Gqya>njj;*PJUR#gh zT(&b_F_9vS-;$e_X;B zO6A-s9|BM2%}>(XSRMR&M}03ZI1CIqi^BU%H~IJh_iNu*Y)09tY0|{2LA7n=y5&oa zOBGwby19+gOUjnGL>0n2_AL$?BH$&z%aVuQm8NRyB^e5_gsi3kmqAQW^VfH&yO7#h zVd;>J#nK`4vwb`NE9;I2@_z4f!^~?aXNg0hcV0808xK3|Fb-^;R5emu84LZQCt$;KzOS7-HEHEU!?dOH9qOi6>=ynfC}g{>ad7vm4ZQXU#qkU z(+Kwaad)Wo#aIhj>J`)I)a#@ZxFd>dQ8Iy18(|UFiJ+U7@y{s&Y4E&T?2;S>#iFG%MO6n zKIvEVIeK)2I?IR~p4Qv8nQN)dE&3`R&#LpzJR?kwUD{4Ms` zs$Dbvy&>~4EW__v9wyczUot33pi3CGBWIDv%WjD32<1{wjkcuJUAxboL=LWgt0XY6 zLgm!Hual8S)BZh>Wu1LLlshiVCDO}oEV)CZ#`9I=uD;~mTWIc#lx9Mna3~j@@B7A8_ScL@v}Y$vva5?Pr8JUVIb=x0 z2X6+(cE>%FhrW1`dRFk2A7>nPupRRe;YxpC4a$+qa>zqXsSkk_C1V9sL`!@aP;{Z? z#Ghn9qaid+FSidv2}O(M9ROIMOgX7fR-tc~)KEBw)8_FeKE16lnpQPaxDt2R%5WRq zR>*TvN;fos;m}d6QhV@qP}uo5z9WR6Z*|SF#k?_RD%Bt+=rV#yMM*|{ZqGHIcB9Ss z`mNLooxnfZznXlvCm#h(G;ma%d>!s(y%(66xu;$gac9)`7j(#O!g?n%irQHV2YQfnFjhTm;mg^P_UH2s}@0`O0YvL)U9ub0{O8D$V8)7;yc5&|1 z4a5iaxJJ{JG_Ks}T0N?ls$V5Sv;EWm_~pk7La{|G+Ybi%F}Vp;c{3A{1nG=w5}&Z0 z*qa8(CK9*!7m@vT+zmf3GkX^s_~4(Aqymo%t*{65kN=*8_D6rFz3clY_q*p6T=CR~ zvmvGhbql>x4uaTLVPQU}Rt&P$r10wU8?sRJ@Y7j#~M>exOhw zu|Y#3c$oYr%)d`O9o0i?ORhOMQ3M+L>Urk`h4||5!32_%RiRfD(4u-d+&!oZToIEk zW^|C0>t#dZJIo*s8+N(5t2Dvqqo1sXI{cqn% z!wN8-eR}w%pa+U{+@GO0L-6JSw_g6rK_4Fpk!=F$uOEd6o2A(vcjr?IHEx$M^}E;2 z-&cz(l14(0lLdYxax2vN6 zec~qw_n6W6hD)?x`ju*+9dBqW#0Tyn_=qY?gFc&`kiO*clc-7pL;7a+9n!~7_9{&8 z*|knhuA))dqr_*gY^YB9cIc-UCe?{xY+W2n|DM6G=g4IsxlqzPe08|C8b~G`%Db+E z7RTU9vR(*b4D@PvvMR#8Srh22xl&jYDi(~7PedE6lsIa2!Rj}#gt4+svlg1#8noF(Lo0uxO zs3B*3QFRX&copzIZ$X1V6oQu|nSAQ6?nL_yzdf_>?5Bvp^=qq% zbe~IgU0aWS`@+@4-z3FH3LhRIe#+&GO2;|7V#}&sUG$%UtqC+mHPgwmga#?TK)W5? z8Fr2Mz}4^HHtJ~~!&VAuGvls|abHB36H)ca9+=zqS@!=`V7A=(rj)62#Kor=wPY~TwM2JKlxFyepn%a^V25i- z2i}W++WPDAYXt~mbn7dnck!~K0g2aMW;Cp5V5mLT*_b$0(sqe0_= z>r=vj-*ge7Un~MJ!~Dv%fu4UG4}&@+glQc-uQ-CtwFC5uw7?G@ASmf`}5L&d58?G{Pjl>VHy<;N7*R+Wb$q zzCv7t>WhFPB6xR*x>t{){lqx_xhEK(A5X#@f7~Es?5sIHmY|YUmZj)_qXp%jocWrN z1$<0kOl${HV`-S{y@^6sV&s3SX>eztRW`|9S*q1n@`Tv4se75pD%wi`4)eCg;VjM9lvNEaI&^w}Sde^+$f-xBy|& z%TEt2PyhLVP@F;9xCQScf}J$kPwkTJ5m^dwB+cqlOaIC0T@ku;-g5w!)wo(*{X@pe ziM#)Skn!)2=k0-XIX?0cqC(bR&=V-nRkBA+i2v_3eCPxYemg6E2Wnur zT(4CpP`Lg3*%*V{(_*aj;7f}AC6@x#^|M{s-v8zdjDMVP{x5Nb6|uP*H6IWD&qzrI zrSN=;lH#uaR|j(;gzgOHFP~q6Oev5n23`pQ>FP(Td6!RTdJ=~l0RXC4mxQ4HDM=jo z&V7jZ)clqlM<~Zj;=%sCzt7AF9@xrxT5b(gQ5n%%cQ3i@)c`2cQ&3xuBVdC#cTi3h z%rx;P3n!pDp3(uhVWg}Udi_D*`G-~-_@hO$KgVx?lUKl|8&rhaJ?W4Hb*{D)^agY^ z%HVb#8!P`bJ9K~w4hVQJ`^?^##G$ zN$^cC5HqPhBLCceI;rv_#tt!h7u*K!d8`ik$bR@|BJDUW;^0Dgf{>ocHRnZLNEjWPUDVf2-V;eu!&>`A*Ad@2o$hmH^7uC zu$&Ii1&KM%fO=XcnV<^F6oPNnG>d?{zS`FBxSBywLyJI-K9K;B=g|OFmCO(hjY%N1 zPa`vN?Lxqiw`leeO=AxpS`{JoMtB~M1Ac=M(Fi8I%{wq7t&W|ueairorypczTNw-w zoQGiK0vXoNxVx<^7j?uW&ayTMPe1Gt>cu_r@Oc{~VqN{GLRmQoeKwzj1(hG4!W^|mqBJewETDuS zBP1hItbt_~bf9YB*Cmx##qkVXGx}!YL7M60uB(hOUFaBs3Fz3V9RS>k z*}q(F8jB~MJiP|_q#{6#6=L%W6p;xiU-dXZ(@u zy;YQoq-zA~RCU(BBMf;!z0EXoZS*w+GZGe5M*ZP`~e}t9grpD ziEIj(%D*UxwsgqG!_)2OY{ZDw1hq!~**%EA1P?Z*D(B*94eCLCW@_GV+ucf_S3uTh zC{(#d7%>8YL&mPU)f7>8iOA!m5%m6SZgTTBNL3aGV-l6Tm`W#nCKLlUHfHMkLO@HC zKpK7vShAZC=ZQI#UI%J^a#)0q^I?e)Qwf|PXrLU=nhM$8wgUQT{O9-@2^rUn4W^Ob|Ew!;QjnO` zBit?AHDTRNAklKvIXRo#g4{amiU_)1SP`Uup94ZctwtE3l ze!yPYxh)GmspnrDX-SE^Zt~j38jU0AV6TACT=W)rF_gjL=cj(8m8Luq3jntg2o85^ zaDsTW>yz-R7{~j%mqB~W8fBikmzamUvS_Ru zA`JP_41$no4Ek9Z4aNOX7R8r7$t=Y^(x}7=R}86?5DfZxY%LEk{%(3+E=$fPyKo!HFGkZw!G$tG=nk!r!$OdK z6#%8s7!@amDlh2CEhGu$4X;9_kF1AY8FFmeH~VymFwz5D?X&_!t%2O5@X1j7)kYh{ zO2|#}nkuizaFV821i6SFatFGQ>l|ZE;+_mPdfXMVi2aZhO)UA|JO;zagw+6SFA5_} z>nX!3rjT(sJ0cQ(I?R*HHy!O?2Xa^>s4sL1UI;J`(Y{MqhHo`HwgK-qmA*iNQJQB9j zIuq$Sx_oUuN0w~aNbvNCr#w_T)iCDFe0dI8LrP%0SjU&R$O|^d4s*uK#vkMXAz73b zVIqsIl4OApfvl;mNSG7x_(NMr_cnh|oy?6uwNs? zoSdql2!o$8A=EPgxyh1r;`GgB#z$uWB>c>yHh~@3Rlmy?0%b~qiG>jS@P)$S+6dv3 zmT81H07|MWsJhBWIhBy%Ap}z`d`{Duw>OcEJOoIlPlpJPJNVsD_10tsswx@y_)wdG z8Mb|iI+%awSQ6V6rA~EHsusN)r3b!&SgVI_L)dk=3AS9sz4uKn-RR`*p@e1l+{WD# zKtmYA4rQkW1eylzW>KU#6yxrwTBsbSnQRkg?ZOzO^xB9{d@jO}1qIp)NEuo-rx7vF7}?=Lmu!E5e{SbcUXn z{N9qR3Q1V{W>^?S^`|hUbq*JE5|M}m;%n&2j=h?J*G|B@1eIX{prk-r5bDD}Lsuda zCY#8PYAMl_!E9x`vlov-^weCXcMI(&b1wA*20ku3TuHye2=gqwn9OI*I#*f85kqtA+481f2=(^k(uh8(YAd(Yk*So@p$OdmhFM# z#}~P&Qp)C^(1^n3hPT%e)~0NzY$nC~OE?*DJ#&kgzK>x3TG8(8zH*H_9^)$ox4&Zz zL0k8y(nbNFlaw-yd0YwfCov=t4;|ynL!3YAk{!QVeOs_T!wM*Oqw!X_m${W+? zR>~RQo3v3PIl<*nTYUn2j8Y2%t=-8`PuaT_u*oD|deNZ5`w7A3XU;TaPuO089Y%2| z9;`E_T?x#7$H1N>+Iu8N?8$jwdBtT=wj$B5ihX`YQYqtJHw| zsJS|at_EW|!>U~4IMdi*tBeePbjI;jCt}=GP}+`4C_L{esecb~8^BGgMQ!uq&!Uu(A(T zr~Bh|Y_u`4EBxmJl}_j(S_-;D6l0wNy-!kN?9d?sC~fh2^84ygQyPAZ8+4dx&5`g{ zK#n~a7LE~up^YPl_EWy_HNGPsqVTi{oWWjP`gKV5w_US4-{|f%by;HCP~IH4XayA! z?&_lsPh2Y*Df)B$c5V>)NTR=js1k;lZ=#r{7sz4^)A!4625P_kK4SS9Dq12dL&kd? z#6;5BU7&)kH7>;$3Y0F@vV8@~jlo7YFSQ&LPY-%E^q zV|(A4D(3M8^;Zmnaqq3|vR|?+$APF}g#Ls1=$*kIX3VHDvItD3rLe|PW+VX_o|(>& z4(S w%A`_F3BC5d=p)`5j&M5+g?2!-v)!=WBe3t0Q;t#}kra^Q&{e%CeWck1&#< zvB9nV;<#aiA@k#3=h=!ZWFnlx{SQq%?B}DDUL4=~29B_ezt4A!kFENQ+K|y+%|67} z#ZiBua%xgU&hrr+C-27%3q<2E7|Ftj)ES>*oGio0-aLvj_2gTmoQC2e&eSf&L`NUt z$*VqcNq$%p(i|?5r3s38=nGA*Nng$ygF3iIBYim8QV^v3=Q#@IjK5&!10&_wcim_` zj^mAv9;}nmpi$ZqacT%qkdSBym1L!##0VgnqfuR1z3SwbvQk*GU_=VDzm)M1G@Lj_ z66!43j6WlXpmNORv!$SOrR>msAkUM2ptRdhgRwO3J}E-#)&h9mvDrpHmR);r9i>}@ z$c3r)?TBsStUThMht*0@d^+^o&1z*OwxJRFPP--VOG(gdNN-$aB}~{}`GeKJdkM4J z?FC*B>#v;37?Dz z%$tZgicsFexd?Ph2RD?bRMZ6htkvVFqqvNunlYVKWRS=m9w`jX#w+T~I-|ix=X2|y z?~lyY>a_CdcX{g2T5gJk9|SL4{^ZK4oPCiMd^m4{w0_8(I4Y#`2={A*oD8nR{s<$s z{OB<5^NfPsP9ZXau`UXT6_I0nC5FW>oB#70Qq1#GviA)PDD&UmdAlO)g9OlM2l{Z6ZOZAM@x~vb1q^a-VUpZ1LWy&UFRW2=J-Hm4UQZ<-Yz^k%D zhM{gm*LN#fi0P{{kOP@5uQt4g<}OvfzxTX(S+ z;r3tObuJ5R1gWkF;|fz-!DvnjCG(-LJXL6syGJ$*ME zNcZjFZ=a6v0xhZaJFERCl6qY);xkf(8L6mL(qQF4h1!fncV`v5y;@MpkZ4Yw$vH|g zJ}aS=nbk=bjJ+L98pJhfke77LYlZ55Zc%@)bJP9sb^1LHV+126(L9D z>Pcg?AG9GqAAN^KHGYa#eYD&rY0msIDOybxJ1oSxvIDtWD&~=t7ACU&$j9$;UR!-7 zQDPmZ#XM=N8T%Q<9Vc%OQW=P?ek4CF@{TXQ-?SB~(JYae@lj~bzj=#LF$>d(@9tv( zIZADCe(Utbm7$EoC8QBu(6d5$e6y4(VORsUcJ z_*K6;aN+mGCG;>%fTqdgGOTbS=5i74KEXK{>dFvMBzJmXV8m{YcE7rxd_)y@@MlR% z;vF(QRav-C+)c<=>TQ9y&)jkIYFCl$vqEupd&N>e&mURcg0BAx^Pr|sOGXQBsi}UL z7y%-BwLx1%RWu_@Rvvs}`9gF3U*1Y_*v6Mp$EQi&gFQ=O&>hn-u_Jzg6YEZqSmu#c zZ$TgH=`PlL;Kw}~d4H@mz8o{~w@Z8m`-v1!fr^skO~_`^p_Wb$Z( z+?!u@TfSyfj=W|%&0a-YzbB!O^7eux(r63MCF6}cSaZE#A)x>9B3`|rQT#i{{rHv+ zPDe#(v*14&-o9$^gZ{m8dCX;n9_*$JTF`vCC$Y(w8QNAo0*S-OkD{s$zO$r7&YBe; z5JnnNme)Qx+1Ei_EG~CkE+QL>53>b;z}%It*71378g1&V0nxiRS- zZ&dNWAHBWh1vhRW|APFy4)JPqov7B3#b8%(33B%!3xVQk)psTvg_VZ9)^a1B4E342 zk6-+SinFtpRbbLS=ll{Ek48SF5WC}L9ukBNursbdqSdp19P>_%ne`PO%{yzQ_tGOF zhcdJe0&Q`gC_W*Hk@AjS3X_i=Fr>#m&74g6zQev6g>B-f%ltT%C@qgB)`3K*v_u4L zi~pC7rw#McV*2d&4Tkl@YxxT5pxSNB!GnKP{VA3Rl{v zDuo#1K1{S~GR)0!QCa=IaI#km`4&G9HLU+(AC0pPQl6HAWiHllPG-_G#-V!!t!P6P zd`%TZ^zWm78hp`uJ5(AWhvPw!RLjAUe`}pH;Dp{unymSg=&fz@3nfIu@+i^Ry7(f- zX^5DPNA348KVL|9CA(<6uKhxD3bBJcGfSFQQFsMA$<4Hs!31V%eA&YzXRE5m7SJ$c zmIX!J#D-9cn8%G3MCkZJqYJhcq!0xgW+R?z8Xw2`ndv-v;|yn0qU~12F%_c7uUUwF zfj?|)dWl1{Nec0HxX-JUb#S}0p12p}SD2zp>C$MogzC{`)*yiodUPU!>t$7814hWv3lBgeY&VRmpnNbX5)TrNs*Z3T+w!bpdm6L2 z*iUfaBUnRV!|QxsDEn88rw`rX`-WfBr)>%AR28kOZW)W&3ltS@?X?k;Z?3VNYrP3} z^QhKkl;_y48-_2R&W)k1dlDH9o`ZIoMp=KStlsHfr99P~mYv?Dt7y3p2rx$~LL9am zNEWfV=n>^cP0Y;1GQ`h9>iVj5(;yH9=KHbiLz5u)QGKX)ov`W+=@xX|a*k!zdH)z& za2tSKxH%|Be|=iqWT@tiOh3=}syw^WXe>Par^ioQGAIz=i z`H;Qpd8~g3S zb_2)>X-4f8%;i6L@k2}Ys`=AzWv}h@{vCLFTaXzil&;7&usTpzDoD$q( zl}?+v^c}m}qMrLkX_Eol1JNp$zTT?G6XflO;RQ{TNn9kA?3nSo%oQBchJ&21{Xg$! zilR<46g5?uH>z7+-vz#jeICp^UQX?;){A{{$4-Dpu9AHRf|aDPxVW>n<1FIJ+9<+J zmCo+QhXeZ0hmc)rsVRE}c)hICjDE1%vHx7?Bdhi)jZ_2y9x$P{?6DmyKVpjg(B z!A7dlMnWnA%gBCEP~y~M2e*#a{j?OW6^1w@RT?$NHY3I(n0CQ^U^#c?#rOsp0qG`e`=++6J!m4sMq5~xgiQVv|(l66lhGTkCPC+@WH}Pn&w1v`% zGUN{uW#^+oxT(&e=n9j+P{T3`rf9@F&guOc!_n$frhF~2TPsNQ5mpZuQ-qiEUN+CUZZt@y3 zB8Cku6S#ou6>>>~LQrt&cM}wnFa5 zJt>&Nu!UNq#dLB}!Ttc^&c$5`Oltle)t>(N21w+X-Aq{0U$_!3`h#ymvg@Kho{|3= z6ky`qf@feNGS(I!dLFV?7{VwzH?Q)ehZU2sn5{y}uK>4+hZ0R{KHwq>HEcPt!-wKl z{H)>cG&FY#1%a%Q_H%~l-n76vrB`&rE{wrbLOUQ{dD3 z{QjOJC2bjYHTMMat%i|_E0iZ(N9+Kl4>NZk~8g#hFk8d z0Z$ih)8#^R;XXZo4&0MX(^zrRzb!k5@FqEeD)4N|D^O{5PXTp_jkc!aF!5b{u|uh7 z_t}p+lUW5ym)Gm~K?X>#Z=5L5n0`)ywB&Azl9We@G@=U7rr?Vsen=H`7SBE?&~Ebg zKEqM8m<2U@yPM+#_f)EvXvgkKIAUC9em!3dbya)zZd9}AWIiOOt+64EpGoSanc_6d z37IAt`sc)$3d_gfgCSx*4E1qGc=#N zu&8kx-+Q5MV{*RF3do(9MPd(Tsq&F69Fgb_0dhcRrE8%;w)qR;^2m1+eIDXIF2;~q z$=USkZ>ArT6vi&q2v+*y_75|q=JBRvxb`AuS*Fd5g2(S5fdpanS6X~1*f<^pdr6c^ zS}3A{Uc)!S)eM;aj~bt{VNj*ul+fo+k`zH-xMtMJnk$3`;k>Pl!run5I<62(cMSXP z#vgig1dx^zrhw7?tj|MtPDrOc3G*eLXYe0^-a%Vjtw{_I4ggllo%_r7{W1b83U%x$ zi3-JIlF#Mz959_Z8?RRljt_VWbeQ)eIe zuYU7<3;R4>-l+)^njRW`@>&WjgN44r9~r31kS7~c2mMsJmD+7y6Q$*~J5S9Y#~;7m zD!}*#_Holz%YA1kVP*)eiAms(xnGDa{iEC!dlz$QoO&!<+YRoeVc~($oVhOZNwO!SDfY&#+%k&(f!yq<$S{>>;&3iCgC*^qVMF#wG{zPqWp3fHyqLbakh`+H`I5F;LSOJe4XyFIuEW& z+@>2hh6aBvjW_eZ5)T|vxs{1H!*9J_ET#Jvr_ph}P86-tapKZny1GlZU~o$;5tN%B z-^WV+Qjl^~{8qAaUZ4@*d#JIp?@!GZWz(O!S7W9+Pz2NWc=qu z^XpT?N`4p%RslYMXBB(EQKNyqS{wVVkMmDmjPP!x2%R6M=*uY?3x~YdAf>NxQ zvnXmw(bp{{xHw5Hbo_SqoyR&^g#!tceuBZgcNvOWCqK@|X=EcA9-4poX7(Ua;xo?u z42@geV3drmrOd#EL7X7jx&B1l!NW+o!ar{Jg04>)^LQj~pS6Q=bcVmHc}pxE*P~%> zbeFVA(TQ^H60mD*GxY{0_P+F4+aD%~2J7(44kD>M!b#u&A~y67B2}+@%d|hNm9lSXYxq8oHK*<@5IVL$+e?=+g1SY=@ZH{(K3^=`4&$d{u}gSR;L zx=TAghZpBzSY!piv--Y#|zJBYP=d%a<^i zu`k(D$TmcyEHz~>YLG2tY?Tp`Jt|2trTp&I_n+VW^Stgo&$;(L=bm%kpXWZuj>;HH zn(x>u9>L-S-;a+NPrN^nA}wS!mXz*zYJtBkVfDjZSu(ul+7lHSIL+d!Q79To-(O+S z+h-VFD#a0y6^nL#`8@)KC$Y=szMB4&>`w{ZOISN3lyXox=1xZYc(S@UBryz{yv73~ z7$nE==GNP(krG9^es5ZXfkdL_7psJ#n>V8}J9dRpEu}R%Bxf4^!9(&Gj<>H9QUrq# z248$VgV^Urr}G)<#@U8uZat&Ci{~1sF;Dg%b6ONa-ZZ54;t08+1qz*MW6)R*t7$J$ zh0G?h9{0TIr1Wi;gW1ULBn@XQH{o9QNncF{M-+f+(`p*7Vn95e=rxu6^E27vEy| zX4!uA@~hQB3C13f_*Zkwur}uNQC^1yAlA$Qf@A974z$u7w`ui?>OGB$1RRQ@gLRF3 zEq4z?sTkcn;T)sH-bbN1Jd1t;ty@Ca$VDkXSLt_z><=A>s@T-0wHi!Z>KjCdqY>sz z5!3i^MA*!Q`9Pecf~dP!A7N_#Zc#6oZ0p`s%zfVHBa7YxI`pFh9$0G32^}ChIpYgpi|GHTmW?Xqk{HvHo;>tk~HfYN;yS?1=NC_|*n)Z+1@i zYi~D$-9W0IQJ;z&h}?!}y?DK=Bt@Bky6G-@A;0goC&%-9)1T)s_`V^hggUE%iR+oh3iT$S=JH%`C=g zct0^dfIfB^k^+4X^?O)7SHr!6oWm!k(ge8a!TEaGs<(M?OWbN#)_qTRXfsA2evc%q zHx9Pf&EUJ#U&oJx)_wu@y?sI~A@&m&8Y3F-LoFWXa!yqiTz>s#+$(H?UIQ%PRSkTG z?ejSPWTuNSdqVl_rFmziiEnHC*T+1jKOgRv`lW8U(+C;q5T}>L%swfYN5Nj*%z%$D zS8jvsgRO<{)Nr3`eGYODEpH{xAW`zN`V0&U_VL|`i+a%W+}1v6Yiyt1YY^W{_AM{U z-$Edsd5yJCe}=uHIWB`^Q((B*<5QsUw<5y|%#_$0kJXj+rY5=lTM2UlrJlnK%ak^L z+$T9=gs95iwC_<%iFKUZ(EMP9-EqCKh{SNiDBT*+rbr9qtI^rnGW~h( zeSpAByYqRAgcvJU8xDl5||IIZD?~2 zVcw@NfFk_+K2tGuJb^|el?UOES0ze~pg>>B9tF^<0vh1d3vkwsaq3|w5%R@dVSX*?XH{?HKHI%Z1DLekc{zF-h zg0#OJsjxX$W4$%ors|AfSzpLSU$+Prh=uu-95X1=%YSgv)uG{>rhJNjgpOCF+aDLw zE1H=WJ@gPA@ZhfU@`WwBMp&BVi`~Cu0`?$Fi>n+f8PQ}teTm>F-Pp|#eOJ@`Jwbco z1Xh|`VuunHpuuy&i~qKAmmPRpyut($RGvc19=FPBjCbr1o?RGd(Y!{sgyd}KcRp`y@(c`DdyvatB%!mK5h5uH4Vuo0F%Q} zmVGjQplHfF(L>)XZzD^{}?&B37O~c{70el&KU+a;THNA@;q( zQ}s)ssK5D4rvq>ENreyyk##;r&zJ+YZ)&BE95~tD@-S^w^hkJ%RZ{Ar6^*;#j5pZEY|Wn5;Oh) znd@%3eN`J~efmIE-nQF}^jQf|{5AUNW zrqeki<>WlziIPH&F`}DHFuZ~c9@kdMTD#GLJMy+&WWm@{5*HE;X;Zs92ABI+-A(~O zQVsmt5DR+X!r%y}Jhy}DUCA&&(Sf8HB?t^3(k|0v`{W;`bJ=~v1R@2npT1(HSuy>? zsVw~rtB_|LgpOL~VGqa87`=a!8WgkGMRbJ~_iwjL##&orcvj2!X0V+DDN+|atRj63iu|(DMC|7VjmW)KP8zsNO({f%c}X`{D;GCbJ`B} z=jh-jT>|qqCR#u+`c%?+vSbHej(t0_FDbb4=h+E|I1z|yhH$a2Dhg%bRwi;{kbf0< zbIv9sfpk=`d)RO}8isXkm9~0fnF%H7*eOu`-f-GccORV=lGeFv#9HJumsvnOus5pP z(6!-_7f9ECchPl`NnfR~iPECjC^SXWphw+dM*FeR(!Ka`fJ+|L4H5GNec>~9N&6~- zm3ze&TY)$=65%5f;{Dxr#KXB8ldRyochl-ZgRMe|ZQ2#v65g4tJ5(lN*E8Hfw>U** zK@}CmY}?wd=2BubO1@fT_QST9xL-PFAiT(h8xVnpH#7&{o#O`Jr|z|3dritrnf$#$ z#~f`(Hlto~ow44AHqEE$eexSH_<7btv)unXNS`&d`LsSG6wmXwGu)@r{Ir(l8vdS} z#jm6kdp{0d!g!_WWP z!Q*a`YXK|ZIA#b|n&(Hd?0f26i}YK<2V1u sy>IG)06zE_S4vQQdp6|`R-3&Ii8%83{Zfby3IZG^1{V4cPLrbl2Ol&??*IS* diff --git a/docs/images/EL_depositing_BeaconChainETH_2.png b/docs/images/EL_depositing_BeaconChainETH_2.png deleted file mode 100644 index 7fdb154f41c3a993995823de694456781f549034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69580 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 z 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 diff --git a/docs/images/EL_queuing_a_withdrawal.png b/docs/images/EL_queuing_a_withdrawal.png deleted file mode 100644 index 2ec65148e172ce26e630181e61a2a78a433f97c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52566 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�$IX3#AaEzSqB%Q~AW~LXE2ecuh|! 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 diff --git a/docs/images/EigenPods_Architecture.png b/docs/images/EigenPods_Architecture.png deleted file mode 100644 index 12703d6a69eb6bd0383c7880a1bded1216896c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42555 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 NToaA4fC?nFtM{E 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 aJO7y-Y*S31+6ByK00K`}KbLh*2~7Z)szXBn literal 68315 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≻>BZh3ok&*Z#6!P+5p%f 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 literal 193954 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

    AJ0W1e(FbtMj5cYQ4LnlmtdCYoj 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%0DNdQ=}P__yAFMy@Q{5Hx3 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 GvmQ2%-^Evbp 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